Converter um formato de data para outro em PHP

Existe uma maneira simples de converter um formato de data para outro formato de data em PHP?

Tenho isto:

$old_date = date('y-m-d-h-i-s');            // works

$middle = strtotime($old_date);             // returns bool(false)

$new_date = date('Y-m-d H:i:s', $middle);   // returns 1970-01-01 00:00:00
Mas, claro, gostava que devolvesse a data actual em vez do amanhecer. O que estou a fazer de errado?

Author: Vadim Kotov, 2010-01-30

14 answers

O segundo parâmetro de date() tem de ser uma data apropriada (segundos Desde 1 de janeiro de 1970). Você está passando uma corda, que data () não pode reconhecer.

Pode usar strtotime() para converter um string de data em um timestamp. No entanto, mesmo strtotime () não reconhece o formato y-m-d-h-i-s.

PHP 5.3 e up

Utilizar DateTime::createFromFormat. Permite-lhe indicar uma máscara exacta-usando a sintaxe date() - para processar as datas de entrada de texto com.

PHP 5.2 e inferior

Você terá que analisar os elementos (Ano, Mês, Dia, Hora, Minuto, Segundo) manualmente usando substr() e passar os resultados para mktime() Isso vai construir-te um timestamp.

Mas isso dá muito trabalho! Eu recomendo usar um formato diferente que strftime () pode entender. strftime () compreende qualquer entrada de data curta de the next time joe will slip on the ice. por exemplo, isto funciona:
$old_date = date('l, F d y h:i:s');              // returns Saturday, January 30 10 02:06:34
$old_date_timestamp = strtotime($old_date);
$new_date = date('Y-m-d H:i:s', $old_date_timestamp);   
 248
Author: Pekka 웃, 2010-10-06 13:11:04

A maneira mais fácil de fazer isto é

$myDateTime = DateTime::createFromFormat('Y-m-d', $dateString);
$newDateString = $myDateTime->format('m/d/Y');

Primeiro está a dar-lhe o formato em que a $dateString está. Então você está dizendo o formato que você quer $newDateString para estar em.

Isto também evita o uso do strtotime, que pode ser difícil de trabalhar às vezes.

Se você não está se transformando de um formato de data para outro, mas apenas quer a data atual (ou datetime) em um formato específico, então é ainda mais fácil:

$now = new DateTime();
$timestring = $now->format('Y-m-d h:i:s');

Esta outra questão refere-se também ao mesmo: tópico: converter o formato de data AAAA-mm-dd => dd-mm-AAAA.

 86
Author: ceiroa, 2017-05-23 12:10:27

O Básico

A forma simplista de converter um formato de data para outro é usar strtotime() com date(). strtotime() irá converter a data em uma Data do Unix . Esse Timestamp do Unix pode então ser passado para date() para convertê-lo para o novo formato.

$timestamp = strtotime('2008-07-01T22:35:17.02');
$new_date_format = date('Y-m-d H:i:s', $timestamp);

Ou como linha única:

$new_date_format = date('Y-m-d H:i:s', strtotime('2008-07-01T22:35:17.02'));

Tenha em mente que strtotime() requer que a data esteja num formato válido . A não apresentação de um formato válido resultará em strtotime() devolver o falso, o que fará com que a tua data seja 1969-12-31.

Utilização DateTime()

A partir de PHP 5.2, PHP ofereceu o DateTime() classe que nos oferece ferramentas mais poderosas para trabalhar com datas (e tempo). Podemos reescrever o código acima usando DateTime() como tal:

$date = new DateTime('2008-07-01T22:35:17.02');
$new_date_format = $date->format('Y-m-d H:i:s');

Trabalhar com as datas do Unix

date() toma um timeatamp Unix como segundo parâmetro e devolve uma data formatada para si:

$new_date_format = date('Y-m-d H:i:s', '1234567890');

DateTime() funciona com datas do Unix adicionando um @ antes da data:

$date = new DateTime('@1234567890');
$new_date_format = $date->format('Y-m-d H:i:s');

Se o intervalo de tempo que tem estiver em milisegundos (pode terminar em 000 e/ou o intervalo de tempo tiver treze caracteres) terá de O converter para segundos antes de o poder converter para outro formato. Há duas maneiras de fazer isto:

  • cortar os últimos três dígitos usando substr()
Cortar os últimos três dígitos pode ser feito de várias maneiras, mas usar substr() é o fácil:
$timestamp = substr('1234567899000', -3);
  • divida o subestr por 1000

Você também pode converter a data em segundos dividindo-se por 1000. Dado que o intervalo de tempo é demasiado grande para os sistemas de 32 bits fazerem matemática, terá de usar a biblioteca 'BCMath' para fazer a matemática como cadeias de caracteres:

$timestamp = bcdiv('1234567899000', '1000');

Para obter um Timestamp do Unix, poderá usar strtotime() que devolve um Timestamp do Unix:

$timestamp = strtotime('1973-04-18');

Com DateTime () pode usar DateTime::getTimestamp()

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();
Se estás a fugir PHP 5. 2 poderá usar a opção de formatação U em vez disso:
$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');

Trabalhar com formatos de data não-normalizados e ambíguos

Infelizmente, nem todas as datas com as quais um desenvolvedor tem de trabalhar estão num formato padrão. Felizmente, o PHP 5.3 forneceu-nos uma solução para isso. DateTime::createFromFormat() permite-nos dizer ao PHP em que Formato uma string de data está para que possa ser processada com sucesso em um objeto DateTime para posterior manipulação.
$date = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM');
$new_date_format = $date->format('Y-m-d H:i:s');

Em PHP 5.4 nós ganhou a capacidade de fazer o acesso de membro de classe em instanciação foi adicionado o que nos permite transformar o nosso código DateTime() em uma linha única:

$new_date_format = (new DateTime('2008-07-01T22:35:17.02'))->format('Y-m-d H:i:s');

$new_date_format = DateTime::createFromFormat('F-d-Y h:i A', 'April-18-1973 9:48 AM')->format('Y-m-d H:i:s');
 40
Author: John Conde, 2016-12-15 16:23:42

Tenta isto:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
 24
Author: Sarfraz, 2010-01-30 13:01:53

Para converter $date de dd-mm-yyyy hh:mm:ss para uma data própria de MySQL Eu faço assim:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
 12
Author: Jelle de Fries, 2017-08-18 08:48:33
$old_date = date('y-m-d-h-i-s');       // works
Estás a fazer mal, isto deve ser ...
$old_date = date('y-m-d h:i:s');       // works

O separador do tempo é ': '


Acho que isto vai ajudar...
$old_date = date('y-m-d-h-i-s');              // works

preg_match_all('/(\d+)-(\d+)-(\d+)-(\d+)-(\d+)-(\d+)/', $old_date, $out, PREG_SET_ORDER);
$out = $out[0];
$time = mktime($out[4], $out[5], $out[6], $out[2], $out[3], $out[1]);

$new_date = date('Y-m-d H:i:s', $time); 

Ou


$old_date = date('y-m-d-h-i-s');              // works

$out = explode('-', $old_date);
$time = mktime($out[3], $out[4], $out[5], $out[1], $out[2], $out[0]);

$new_date = date('Y-m-d H:i:s', $time); 
 9
Author: Rifat, 2010-01-30 15:13:50

O seguinte é um método fácil de converter datas para diferentes formatos.

// Create a new DateTime object
$date = DateTime::createFromFormat('Y-m-d', '2016-03-25');

// Output the date in different formats
echo $date->format('Y-m-d')."\n";
echo $date->format('d-m-Y')."\n";
echo $date->format('m-d-Y')."\n";
 9
Author: Peter, 2018-01-19 07:09:24

Você precisa converter o $old_ date de volta para uma data Temporal, uma vez que a função data necessita de uma data temporal como seu segundo argumento.

 6
Author: John Parker, 2010-01-30 13:01:44
O Strtotime vai resolver isso. as datas não são as mesmas e todas em formato us.
<?php
$e1 = strtotime("2013-07-22T12:00:03Z");
echo date('y.m.d H:i', $e1);
echo "2013-07-22T12:00:03Z";

$e2 = strtotime("2013-07-23T18:18:15Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-23T18:18:15Z";

$e1 = strtotime("2013-07-21T23:57:04Z");
echo date ('y.m.d H:i', $e2);
echo "2013-07-21T23:57:04Z";
?>
 6
Author: de_nuit, 2013-07-23 21:10:34

Tenta isto:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
 4
Author: vineet, 2017-06-06 07:36:47

Esta forma nativa irá ajudar a converter qualquer formato inserido para o formato desejado.

$formatInput = 'd-m-Y'; //Give any format here, this would be converted into your format
$dateInput = '01-02-2018'; //date in above format

$formatOut = 'Y-m-d'; // Your format
$dateOut = DateTime::createFromFormat($formatInput, $dateInput)->format($formatOut);
 2
Author: Nishad Up, 2018-02-07 08:38:35
Isto resolveu-se para mim.
$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

Resultado: 2018-04-18

 2
Author: Arthi Rajgopal, 2018-04-04 18:34:55

Esta é a outra forma de converter o formato de data

 <?php
$pastDate = "Tuesday 11th October, 2016";
$pastDate = str_replace(",","",$pastDate);

$date = new DateTime($pastDate);
$new_date_format = $date->format('Y-m-d');

echo $new_date_format.' 23:59:59'; ?>
 1
Author: Varun Malhotra, 2017-06-06 07:22:01

Apenas usando cordas, para mim é uma boa solução, menos problemas com mysql. Detecta o formato atual e altera - o se necessário, esta solução é apenas para o formato espanhol / francês e Inglês, sem usar a função datetime php.

class dateTranslator {

 public static function translate($date, $lang) {
      $divider = '';

      if (empty($date)){
           return null;   
      }
      if (strpos($date, '-') !== false) {
           $divider = '-';
      } else if (strpos($date, '/') !== false) {
           $divider = '/';
      }
      //spanish format DD/MM/YYYY hh:mm
      if (strcmp($lang, 'es') == 0) {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 4) {
                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '-') == 0) {
                $date = str_replace("-", "/", $date);
           }
      //english format YYYY-MM-DD hh:mm
      } else {

           $type = explode($divider, $date)[0];
           if (strlen($type) == 2) {

                $date = self::reverseDate($date,$divider);
           } 
           if (strcmp($divider, '/') == 0) {
                $date = str_replace("/", "-", $date);

           }   
      }
      return $date;
 }

 public static function reverseDate($date) {
      $date2 = explode(' ', $date);
      if (count($date2) == 2) {
           $date = implode("-", array_reverse(preg_split("/\D/", $date2[0]))) . ' ' . $date2[1];
      } else {
           $date = implode("-", array_reverse(preg_split("/\D/", $date)));
      }

      return $date;
 }

UTILIZAÇÃO

dateTranslator::translate($date, 'en')
 0
Author: Alejandro Aranda, 2017-09-01 08:02:25