Pregunta

Hay una manera sencilla de convertir un formato de fecha en otro formato de fecha en PHP?

Tengo este:

$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

Pero me gustaría, por supuesto, para volver a fecha actual, en lugar de la grieta 'o el amanecer.¿Qué estoy haciendo mal?

¿Fue útil?

Solución

El segundo parámetro date() debe ser una adecuada marca de tiempo (segundos desde el 1 de enero de 1970).Se pasa una cadena, que date() no puede reconocer.

Puede utilizar strtotime() para convertir una cadena de fecha en una marca de tiempo.Sin embargo, incluso strtotime() no reconoce el y-m-d-h-i-s formato.

PHP 5.3 y hasta

Uso DateTime::createFromFormat.Le permite especificar exactamente una máscara - el uso de la date() la sintaxis para analizar entrante cadena de fechas.

PHP 5.2 y menor

Usted tendrá que analizar los elementos (año, mes, día, hora, minuto, segundo) de forma manual utilizando substr() y de la mano de los resultados a la función mktime() que va a construir una marca de tiempo.

Pero eso es un montón de trabajo!Recomiendo el uso de un formato diferente al que strftime() puede entender.strftime() entiende cualquier fecha de entrada en corto de los the next time joe will slip on the ice.por ejemplo, esto 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);   

Otros consejos

La forma más sencilla de hacer esto es

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

Usted es el primer dándole el formato $ DateString es. Entonces le está diciendo que el formato que desee $ newDateString estar en.

Esto también evita el uso de strtotime, que puede ser difícil de trabajar a veces.

Si no está transformando de un formato a otro día, pero sólo desea que la fecha actual (o de fecha y hora) en un formato específico, entonces es aún más fácil:

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

Esta otra pregunta también se refiere al mismo tema: Convertir formato de fecha aaaa-mm-dd => dd-mm-aaaa .

Los fundamentos

La forma simplista para convertir un formato de fecha a otra es utilizar strtotime() date() . strtotime() convertirá la fecha en un marca de tiempo Unix . Esa marca de tiempo Unix a continuación, se puede pasar a date() para convertirlo en el nuevo formato.

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

O como una sola línea:

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

Tenga en cuenta que strtotime() requiere la fecha para estar en una válida formato . Si no se proporciona un formato válido dará lugar a strtotime() falsa devolver lo que hará que su fecha sea 1969-12-31.

Uso DateTime()

A partir de PHP 5.2, PHP ofreció la href="http://docs.php.net/manual/en/class.datetime.php" rel="noreferrer"> DateTime() clase el que las ofertas nos herramientas más potentes para trabajar con fechas (y tiempo). Podemos reescribir el código anterior utilizando DateTime() como así:

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

Trabajo con marcas de tiempo Unix

date() toma una timeatamp Unix como su segundo parámetro y devuelve una fecha formateada para usted:

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

DateTime () trabaja con marcas de tiempo Unix mediante la adición de un @ antes de la marca de tiempo:

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

Si la marca de tiempo que se tiene es en milisegundos (que puede terminar en 000 y / o la marca de tiempo es de trece caracteres de longitud) que tendrá que convertirlo a segundos antes de poder puede convertirlo a otro formato. Hay dos maneras de hacer esto:

Recorte los tres últimos dígitos se puede lograr de varias maneras, pero utilizando substr() es la más fácil:

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

También puede convertir la marca de tiempo en segundos dividiendo por 1000. Debido a que la marca de tiempo es demasiado grande para sistemas de 32 bits para hacer matemáticas en la que tendrá que utilizar el BCMath biblioteca para hacer los cálculos como cadenas:

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

Para obtener una marca de tiempo Unix puede utilizar strtotime() que devuelve una marca de tiempo Unix:

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

Con DateTime () se puede usar DateTime::getTimestamp()

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

Si está ejecutando PHP 5.2 se puede utilizar la opción de formato U lugar:

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

Trabajo con formatos de fecha ambiguos y no estándar

Por desgracia, no todas las fechas que un desarrollador tiene que trabajamos están en un formato estándar. Afortunadamente PHP 5.3 nos proporcionó una solución para eso. DateTime::createFromFormat() nos permite notificar a PHP qué formato es una cadena de fecha en la que se puede analizar con éxito en un objeto DateTime para su posterior manipulación.

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

En PHP 5.4 que ganó la capacidad de hacer el acceso miembro de la clase en la creación de instancias se ha añadido que nos permite convertir nuestro código DateTime() en una sola línea:

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

Prueba esto:

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

Para convertir $date de dd-mm-yyyy hh:mm:ss a una fecha y hora correcta MySQL Voy como esto:

$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

que está haciendo mal aquí, esto debería ser

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

separador de tiempo es ':'


Creo que esto ayudará ...

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

o


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

El siguiente es un método fácil para convertir las fechas 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";

Es necesario para convertir la parte posterior OLD_DATE $ en una marca de tiempo, ya que la función de la fecha href="http://www.php.net/manual/en/function.date.php" requiere una marca de tiempo como segundo argumento.

strtotime funcionará eso. las fechas no son lo mismo y todo en nosotros-formato.

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

De esta manera nativa ayudará a convertir cualquier formato introducida en el formato deseado.

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

Prueba esto:

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

Esto resolvió para mí,

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

Salida: 04/18/2018

Esta es la otra manera se puede convertir el formato de la fecha

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

Sólo el uso de cadenas, para mí es una buena solución, menos problemas con MySQL. Detecta el formato actual y los cambios si es necesario, esta solución sólo es para el formato de formato de Inglés español / francés y, sin el uso de fecha y hora php función.

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

USE

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

Sé que esto es viejo, pero, en el funcionamiento en un proveedor que inconsistentemente utiliza 5 formatos de fecha diferentes en sus APIs (y servidores de prueba con una variedad de versiones de PHP a partir de las 5 de través de las últimas 7 de), decidí escribir una convertidor universal que funciona con una gran variedad de versiones de PHP.

Este convertidor se llevará a prácticamente cualquier entrada, incluyendo cualquier formato de fecha y hora estándar (incluyendo con o sin milisegundos) y cualquier representación Epoch Time (incluyendo con o sin milisegundos) y convertirlo en prácticamente cualquier otro formato .

Para llamar a él:

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

Envío nulo para el formato hará que la función devuelve la fecha y hora en la efeméride del instante / Unix. De lo contrario, enviar cualquier cadena de formato de esa fecha () soportes, así como con ".u" para milisegundos (milésimas de segundo que manejo, así, a pesar de que la fecha () devuelve ceros).

Aquí está el 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;    
        }
    ?>

Aquí hay algunas llamadas de muestra - se dará cuenta de que también se ocupa de los datos de zona horaria (aunque, como se ha señalado anteriormente, en cualquier momento sin GMT se devuelve en su zona horaria).

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

Aquí está la salida:

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

Lo único que no en esta versión es la posibilidad de seleccionar la zona horaria que desea que la fecha y hora volvieron a estar en. Originalmente, escribí esto para cambiar cualquier fecha y hora a la efeméride del instante, el apoyo de zona horaria es así, yo no necesitaba . Es trivial para añadir sin embargo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top