2010-01-30 32 views
249

¿Existe una manera simple de convertir un formato de fecha a otro formato de fecha en PHP?Convierta un formato de fecha en otro en PHP

tengo unas pocas cosas:

$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, al igual que para devolver una fecha actual en lugar de la grieta 'o amanecer. ¿Qué estoy haciendo mal?

+0

http://tech-blog.maddyzone.com/php/type-date-convert-php muy buen artículo –

Respuesta

229

El segundo parámetro para date() debe ser un sello de tiempo apropiado (segundos desde el 1 de enero de 1970). Está pasando una cadena, que date() no puede reconocer.

Puede usar 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 hasta

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

PHP 5.2 y menor

Usted tendrá que analizar los elementos (año, mes, día, hora, minuto, segundo) utilizando manualmente substr() y entregar los resultados a mktime() que 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 menos de 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); 
+0

Gracias Pekka, acaba de editar mi pregunta, que intentaron pero tampoco parece funcionar. – Tom

+0

Edité la respuesta mientras la aceptabas :) Agregué algunos más ejemplos y referencias. –

+0

Gotcha, ese es de hecho el problema. Es un nombre de archivo fijo que necesito volver a convertir en una fecha (tiene que estar en ese formato), así que descubriré una solución alternativa. – Tom

3

Es necesario para convertir el $ OLD_DATE de nuevo en una marca de tiempo, ya que el date function requiere una marca de tiempo como segundo argumento.

21

Prueba esto:

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

No funciona, strtotime() no reconoce el formato. Acabo de tratar. –

+0

de acuerdo, acabo de poner en el código de formato del cuestionario, debe haber un formato adecuado especificado. – Sarfraz

+0

funcionó para mí. Mi $ old_date fue algo así como 2012-05-22T19: 16: 37 + 01: 00. ¡Por cierto, gracias! – VishwaKumar

7
$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 este 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); 
+0

Sí, seguro gracias, es un nombre de archivo GUID que quiero convertir a un formato de fecha apropiado. – Tom

78

La forma más sencilla de hacerlo es

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

usted es el primero que dando el formato $ DateString es. Entonces le está diciendo que el formato quieres que $ newDateString esté dentro

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

Si no está transformando de un formato de fecha a otra, sino que desea es 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 a la misma tema: Convert date format yyyy-mm-dd => dd-mm-yyyy.

+0

¿Y cómo es un duplicado si le hago la pregunta anterior a la que se refiere? – Tom

+1

He editado la respuesta. Solo quería señalar que estas dos preguntas deberían estar vinculadas de alguna manera. – ceiroa

+0

disponible en php 5.3+ – Zorox

9

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

$date = DateTime::createFromFormat('d-m-Y H:i:s',$date)->format('Y-m-d H:i:s'); 
+2

No debe encadenar estos métodos a menos que esté 110% seguro de que $ date es una fecha válida y se ajusta al formato. Dicho esto, una fecha inválida que no coincida exactamente con el formato devolverá: 'Error fatal: llamada a un formato de función de miembro() en un no objeto'. ¡Solo un aviso! –

+0

Es cierto que una mejor solución es hacerlo en 3 pasos con una comprobación nula como paso intermedio. –

4

strtotime funcionará eso. las fechas no son las mismas 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"; 
?> 
34

Los fundamentos

La manera simplista para convertir un formato de fecha a otra es utilizar strtotime() con date(). strtotime() convertirá la fecha en Unix Timestamp. Esa marca de tiempo Unix se puede pasar al date() para convertirlo 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 la fecha para estar en una valid format. Si no se proporciona un formato válido, el strtotime() devuelve falso, lo que provocará que su fecha sea 1969-12-31.

Usando DateTime()

A partir de PHP 5.2, PHP ofrece la clase DateTime() que nos ofrece las herramientas más potentes para trabajar con fechas (y tiempo). Podemos reescribir el código anterior utilizando DateTime() como tan:

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

Trabajando con Unix marcas de tiempo

date() toma un 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() funciona con marcas de tiempo de Unix agregando 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 tiene está en milisegundos (puede terminar en 000 y/o la marca de tiempo tiene trece caracteres) necesitará convertirla a segundos para poder convertirla a otro formato.Hay dos maneras de hacer esto:

  • Recorte los últimos tres dígitos off utilizando substr()

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); 
  • Dividir 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 la biblioteca BCMath a 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 utilizar 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 U la aplicación de formato:

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

Trabajar con formatos no estándar y fecha ambigua

Desafortunadamente no todas las fechas en las que un desarrollador tiene que trabajar con están en un formato estándar. Afortunadamente, PHP 5.3 nos brindó una solución para eso. DateTime::createFromFormat() nos permite decirle a PHP en qué formato está una cadena de fecha para que pueda analizarse correctamente 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 ganamos 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'); 
2

Prueba esto:

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

El siguiente es un método sencillo 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"; 
-1

Simplemente usando 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 el formato español/francés y el formato inglés, sin utilizar 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; 
} 

USO

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

Ésta es la otra manera se 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'; ?> 
0

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