Convierte un formato de fecha en otro en PHP


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

Tengo esto:

$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, por supuesto, me gustaría devolver una fecha actual en lugar de la grieta 'o amanecer. ¿Qué estoy haciendo mal?

Author: Vadim Kotov, 2010-01-30

14 answers

El segundo parámetro de date() debe ser una marca de tiempo adecuada (segundos desde el 1 de enero de 1970). Estás pasando 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 formato y-m-d-h-i-s.

PHP 5.3 y superiores

Uso DateTime::createFromFormat. Le permite especificar una máscara exacta-usando la sintaxis date() - para analizar las fechas de cadena entrantes con.

PHP 5.2 y menor

Tendrá que analizar los elementos (año, mes, día, hora, minuto, segundo) manualmente usando substr() y entregar los resultados a mktime() eso le construirá una marca de tiempo.

¡Pero eso es mucho trabajo! Recomiendo usar un formato diferente que strftime () pueda entender. strftime () entiende cualquier entrada de fecha inferior a 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);   
 248
Author: Pekka 웃,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-06 13:11:04

La forma más fácil de hacer esto es

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

Primero le está dando el formato dat dateString. Entonces le estás diciendo el formato que quieres be newDateString para estar en.

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

Si no se está transformando de un formato de fecha a otro, pero solo desea la fecha actual (o datetime) 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 el formato de fecha aaaa-mm-dd => dd-mm-aaaa.

 86
Author: ceiroa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:27

Los Fundamentos

La forma simplista de convertir un formato de fecha en otro es usar strtotime() con date(). strtotime() convertirá la fecha en una Marca de tiempo Unix. Esa marca de tiempo Unix se puede pasar a date() para convertirla al 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 que la fecha esté en un formato válido. Si no se proporciona un formato válido, strtotime() devolver false lo que hará que su fecha sea 1969-12-31.

Usando DateTime()

A partir de PHP 5.2, PHP ofreció la DateTime() clase que nos ofrece herramientas más potentes para trabajar con fechas (y horas). Podemos reescribir el código anterior usando DateTime() de la siguiente manera:

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

Trabajar con marcas de tiempo Unix

date() toma una marca de tiempo Unix como segundo parámetro y devuelve una fecha formateada para usted:

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

DateTime () funciona con marcas de tiempo Unix añadiendo 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 tiene es en milisegundos (puede terminar en 000 y/o la marca de tiempo es de trece caracteres de largo) tendrá que convertirlo a segundos antes de que pueda convertirlo a otro formato. Hay dos maneras de hacer esto:

  • Recorta los últimos tres dígitos usando substr()

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

$timestamp = substr('1234567899000', -3);
  • Dividir la 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 que los sistemas de 32 bits hagan matemáticas, necesitará usar la biblioteca BCMath para hacer las matemáticas como cadenas:

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

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

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

Con DateTime () puedes usar DateTime::getTimestamp()

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

Si estás corriendo PHP 5.2 puede usar la opción de formato U en su lugar:

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

Trabajar con formatos de fecha no estándar y ambiguos

Desafortunadamente no todas las fechas con las que un desarrollador tiene que trabajar están en un formato estándar. Afortunadamente PHP 5.3 nos proporcionó una solución para eso. DateTime::createFromFormat() nos permite decirle a PHP en qué formato está una cadena de fecha para que pueda ser analizada 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 nos se ha agregado la capacidad de hacer acceso a miembros de la clase en la instanciación, lo que nos permite convertir nuestro código DateTime() en un solo liner:

$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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-15 16:23:42

Prueba esto:

$old_date = date('y-m-d-h-i-s');
$new_date = date('Y-m-d H:i:s', strtotime($old_date));
 24
Author: Sarfraz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-30 13:01:53

Para convertir $date de dd-mm-yyyy hh:mm:ss a un datetime MySQL apropiado Voy así:

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s');
 12
Author: Jelle de Fries,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-18 08:48:33
$old_date = date('y-m-d-h-i-s');       // works

Usted está haciendo mal aquí, esto debe ser

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

El 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); 
 9
Author: Rifat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-30 15:13:50

El siguiente es un método fácil para convertir fechas a 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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-19 07:09:24

Necesita convertir the old_date de nuevo en una marca de tiempo, ya que la función date requiere una marca de tiempo como segundo argumento.

 6
Author: John Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-30 13:01:44

Strtotime lo solucionará. las fechas no son las mismas y todas en formato estadounidense.

<?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,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-23 21:10:34

Prueba esto:

$tempDate = explode('-','03-23-15');
$date = '20'.$tempDate[2].'-'.$tempDate[0].'-'.$tempDate[1];
 4
Author: vineet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-06 07:36:47

Esta forma nativa ayudará a convertir cualquier formato introducido al 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);
 2
Author: Nishad Up,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-07 08:38:35

Esto resuelto para mí,

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

Salida: 2018-04-18

 2
Author: Arthi Rajgopal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-04 18:34:55

Esta es la otra forma en que puede convertir el formato de 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'; ?>
 1
Author: Varun Malhotra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-06 07:22:01

Solo usar cadenas, para mí es una buena solución, menos problemas con mysql. Detecta el formato actual y lo cambia si es necesario, esta solución es solo para formato español / francés y formato inglés, sin usar la función 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;
 }

USE

dateTranslator::translate($date, 'en')
 0
Author: Alejandro Aranda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-01 08:02:25