Pergunta

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

Eu 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 eu gostaria que ele retornasse uma data atual em vez do crack 'o Dawn. O que estou fazendo errado?

Foi útil?

Solução

O segundo parâmetro para date() precisa ser um registro de data e hora adequado (segundos desde 1º de janeiro de 1970). Você está passando uma string, que data () não consegue reconhecer.

Você pode usar strtotime () Para converter uma string de data em um registro de data e hora. No entanto, mesmo o strtotime () não reconhece o y-m-d-h-i-s formato.

Php 5.3 e acima

Usar DateTime::createFromFormat. Permite especificar uma máscara exata - usando o date() Sintaxe - Para analisar as datas de string de entrada.

Php 5.2 e inferior

Você terá que analisar os elementos (ano, mês, dia, hora, minuto, segundo) usando manualmente substr() e entregar os resultados a mktime () Isso vai criar um registro de data e hora.

Mas isso é muito trabalho! Eu recomendo o uso de um formato diferente que o strftime () pode entender. strftime () entende algum Data de entrada antes de the next time joe will slip on the ice. Por exemplo, isso 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);   

Outras dicas

A maneira mais fácil de fazer isso é

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

Você está dando primeiro a ele o formato $ DATESTRING. Então você está dizendo o formato em que deseja que $ NewDestring esteja.

Isso 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 deseja a data atual (ou datetime) em um formato específico, é ainda mais fácil:

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

Esta outra questão também se refere ao mesmo tópico: Converter Data Formato Aaaaaa-mm-dd => dd-mm-yyyy.

O básico

A maneira simplista de converter um formato de data em outro é usar strtotime() com date(). strtotime() vai converter a data em um UNIX Timestamp. Esse timestamp Unix pode ser passado para date() para convertê -lo no novo formato.

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

Ou como uma linha:

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

Tenha em mente que strtotime() exige que a data esteja em um formato válido. A falha em fornecer um formato válido resultará em strtotime() Retornar false, o que fará com que sua data seja 1969-12-31.

Usando DateTime()

A partir de Php 5.2, o 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 assim:

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

Trabalhando com registro de data e hora do Unix

date() pega um timeatamp Unix como seu segundo parâmetro e retorna uma data formatada para você:

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

DateTime () funciona com o timestamps do Unix adicionando um @ Antes do timestamp:

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

Se o registro de data e hora que você tem estiver em milissegundos (pode terminar em 000 e/ou o registro de data e hora tem treze caracteres), você precisará convertê -lo em segundos antes de poder convertê -lo em outro formato. Há duas maneiras de fazer isso:

  • Apare os últimos três dígitos usando substr()

Cortar os últimos três dígitos pode ser alcançado de várias maneiras, mas usando substr() é o mais fácil:

$timestamp = substr('1234567899000', -3);
  • Divida o substrato por 1000

Você também pode converter o registro de data e hora em segundos dividindo -se por 1000. Como o registro de data e hora é muito grande para sistemas de 32 bits para fazer matemática, você precisará usar o Bcmath Biblioteca para fazer a matemática como cordas:

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

Para obter um timestamp Unix que você pode usar strtotime() que retorna um registro de data e hora do Unix:

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

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

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->getTimestamp();

Se você estiver executando o Php 5.2, você pode usar o U Opção de formatação em vez disso:

$date = new DateTime('2008-07-01T22:35:17.02');
$timestamp = $date->format('U');

Trabalhando com formatos de data não padrão e ambíguos

Infelizmente, nem todas as datas com as quais um desenvolvedor precisa trabalhar estão em um formato padrão. Felizmente, o PHP 5.3 nos forneceu uma solução para isso. DateTime::createFromFormat() Permite -nos informar o PHP em qual formato uma string de data está, para que possa ser analisada com sucesso em um objeto DateTime para manipulação adicional.

$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');

No Php 5.4, ganhamos a capacidade de fazer o acesso à classe em instanciação, o que nos permite transformar nosso DateTime() Code em uma linha:

$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');

Experimente isso:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));

Converter $date a partir de dd-mm-yyyy hh:mm:ss Para um MySQL DateTime adequado, eu vou assim:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
$old_date = date('y-m-d-h-i-s');       // works

você está fazendo errado aqui, isso deve ser

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

O separador do tempo é ':'


Eu acho que isso 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); 

A seguir, é apresentado um método fácil de converter datas em 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";

Você precisa converter o $ Old_date de volta em um registro de data e hora, como o função de data requer um registro de data e hora como seu segundo argumento.

O StrTotime vai resolver isso. As datas não são as mesmas e tudo em formato americano.

<?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";
?>

Essa maneira nativa ajudará a converter qualquer formato inserido no 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);

Experimente isso:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];

Isso resolveu para mim,

$old = '18-04-2018';
$new = date('Y-m-d', strtotime($old));
echo $new;

Saída: 2018-04-18

Esta é a outra maneira que você pode 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'; ?>

Apenas usando strings, para mim é uma boa solução, menos problemas com o MySQL. Detecta o formato atual e o altera, se necessário, essa solução é apenas para formato espanhol/francês e formato inglês, sem usar a função PHP DateTime.

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;
 }

USAR

dateTranslator::translate($date, 'en')

Eu sei que isso é antigo, mas, ao encontrar um fornecedor que usa de maneira inconsistente 5 formatos de data diferentes em suas APIs (e servidores de teste com uma variedade de versões PHP dos 5 aos 5 mais recentes), decidi escrever um conversor universal que Trabalha com uma infinidade de versões PHP.

Este conversor terá praticamente qualquer entrada, incluindo qualquer formato padrão de dataTime (inclusive com ou sem milissegundos) e qualquer representação do tempo da época (inclusive com ou sem milissegundos) e converta -a em praticamente qualquer outro formato.

Para chamá -lo:

$TheDateTimeIWant=convertAnyDateTome_toMyDateTime([thedateIhave],[theformatIwant]);

Enviar NULL para o formato fará com que a função retorne o tempo DATETIME no tempo de Epoch/Unix. Caso contrário, envie qualquer String de Formato que Date () suporta, bem como ".u" para milissegundos (também lidar com milissegundos, mesmo que a data () retorne zeros).

Aqui está o código:

        <?php   
        function convertAnyDateTime_toMyDateTime($dttm,$dtFormat)
        {
            if (!isset($dttm))
            {
                return "";
            }
            $timepieces = array();
            if (is_numeric($dttm))
            {
                $rettime=$dttm;
            }
            else
            {
                $rettime=strtotime($dttm);
                if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))>0)
                {
                    $rettime=$rettime.substr($dttm,strpos($dttm,"."),strpos($dttm,"-",strpos($dttm,"."))-strpos($dttm,"."));
                    $timepieces[1]="";
                }
                else if (strpos($dttm,".")>0 and strpos($dttm,"-",strpos($dttm,"."))==0)
                {               
                    preg_match('/([0-9]+)([^0-9]+)/',substr($dttm,strpos($dttm,"."))." ",$timepieces);
                    $rettime=$rettime.".".$timepieces[1];
                }
            }

            if (isset($dtFormat))
            {
                // RETURN as ANY date format sent
                if (strpos($dtFormat,".u")>0)       // Deal with milliseconds
                {
                    $rettime=date($dtFormat,$rettime);              
                    $rettime=substr($rettime,0,strripos($rettime,".")+1).$timepieces[1];                
                }
                else                                // NO milliseconds wanted
                {
                    $rettime=date($dtFormat,$rettime);
                }
            }
            else
            {
                // RETURN Epoch Time (do nothing, we already built Epoch Time)          
            }
            return $rettime;    
        }
    ?>

Aqui estão algumas chamadas de amostra - você observará que também lida com os dados do fuso horário (embora, como observado acima, qualquer tempo que não seja GMT seja retornado no seu fuso horário).

        $utctime1="2018-10-30T06:10:11.2185007-07:00";
        $utctime2="2018-10-30T06:10:11.2185007";
        $utctime3="2018-10-30T06:10:11.2185007 PDT";
        $utctime4="2018-10-30T13:10:11.2185007Z";
        $utctime5="2018-10-30T13:10:11Z";
        $dttm="10/30/2018 09:10:11 AM EST";

        echo "<pre>";
        echo "<b>Epoch Time to a standard format</b><br>";
        echo "<br>Epoch Tm: 1540905011    to STD DateTime     ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","Y-m-d H:i:s")."<hr>";
        echo "<br>Epoch Tm: 1540905011          to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011","c");
        echo "<br>Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: ".convertAnyDateTime_toMyDateTime("1540905011.2185007","c")."<hr>";
        echo "<b>Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)";
        echo "</b><br>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,null);
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,null);
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,null);
        echo "<br>UTCTime4: ".$utctime4."      ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime4,null);
        echo "<br>UTCTime5: ".$utctime5."              ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime5,null);
        echo "<br>NO MILIS: ".$dttm."        ----RESULT: ".convertAnyDateTime_toMyDateTime($dttm,null);
        echo "<hr>";
        echo "<hr>";
        echo "<b>Returned as whatever datetime format one desires</b>";
        echo "<br>UTCTime1: ".$utctime1." ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime1,"Y-m-d H:i:s")."              Y-m-d H:i:s";
        echo "<br>UTCTime2: ".$utctime2."       ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime2,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"Y-m-d H:i:s.u")."      Y-m-d H:i:s.u";
        echo "<p><b>Returned as ISO8601</b>";
        echo "<br>UTCTime3: ".$utctime3."   ----RESULT: ".convertAnyDateTime_toMyDateTime($utctime3,"c")."        ISO8601";
        echo "</pre>";

Aqui está a saída:

Epoch Tm: 1540905011                        ----RESULT: 2018-10-30 09:10:11

Epoch Tm: 1540905011          to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Epoch Tm: 1540905011.2185007  to UTC        ----RESULT: 2018-10-30T09:10:11-04:00
Returned as Epoch Time (the number of seconds that have elapsed since 00:00:00 Thursday, 1 January 1970, Coordinated Universal Time (UTC), minus leap seconds.)

UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 1540905011.2185007
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 1540894211.2185007
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 1540905011.2185007
UTCTime4: 2018-10-30T13:10:11.2185007Z      ----RESULT: 1540905011.2185007
UTCTime5: 2018-10-30T13:10:11Z              ----RESULT: 1540905011
NO MILIS: 10/30/2018 09:10:11 AM EST        ----RESULT: 1540908611
Returned as whatever datetime format one desires
UTCTime1: 2018-10-30T06:10:11.2185007-07:00 ----RESULT: 2018-10-30 09:10:11              Y-m-d H:i:s
UTCTime2: 2018-10-30T06:10:11.2185007       ----RESULT: 2018-10-30 06:10:11.2185007      Y-m-d H:i:s.u
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30 09:10:11.2185007      Y-m-d H:i:s.u
Returned as ISO8601
UTCTime3: 2018-10-30T06:10:11.2185007 PDT   ----RESULT: 2018-10-30T09:10:11-04:00        ISO8601

A única coisa que não está nesta versão é a capacidade de selecionar o fuso horário em que você deseja que o DateTime devolvido seja. Originalmente, escrevi isso para alterar qualquer tempo para o tempo da época, então não precisava de suporte ao fuso horário. É trivial adicionar embora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top