Strtotime() no funciona con el formato dd/mm/AAAA

Resuelto Simon asked hace 54 años • 17 respuestas

Realmente me gusta la strtotime()función, pero el manual del usuario no brinda una descripción completa de los formatos de fecha admitidos. strtotime('dd/mm/YYYY')No funciona, solo funciona con mm/dd/YYYYformato.

Si tengo la fecha en dd/mm/YYYYformato, ¿cómo puedo convertirla YYYY-mm-dd? Puedo hacerlo usando explode()la función, pero creo que hay mejores soluciones.

Simon avatar Jan 01 '70 08:01 Simon
Aceptado

Aquí está la solución simplificada:

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

Resultado:

2010-05-25

La strtotimedocumentación dice:

Las fechas en los formatos m/d/y o dmy se eliminan al observar el separador entre los distintos componentes: si el separador es una barra ( / ), entonces se supone el m/d/y americano; mientras que si el separador es un guión ( - ) o un punto ( . ), se asume el formato dmy europeo.

 avatar May 23 '2010 13:05

Puede analizar fechas desde un formato personalizado (a partir de PHP 5.3) con DateTime::createFromFormat

$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();

(Aparte: se !utiliza para restablecer valores no especificados a la marca de tiempo de Unix, es decir, la hora será medianoche).


Si no desea (o no puede) utilizar PHP 5.3, en la página del manual Formatos de fecha encontrará una lista completa de los formatos de fecha/hora disponibles que acepta strtotime . Esa página describe más detalladamente el hecho que m/d/Yse infiere d/m/Y(pero puede, como se menciona en las respuestas aquí, usar d-m-Yo d.m.Y) d\tm\tY.


En el pasado, también recurrí al método rápido str_replacemencionado en otra respuesta, además de analizar automáticamente la cadena de fecha en otro formato como

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);
salathe avatar May 23 '2010 14:05 salathe

Esta es una buena solución para muchos problemas:

function datetotime ($date, $format = 'YYYY-MM-DD') {

    if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date);
    if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date);
    if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date);

    if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date);
    if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date);
    if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date);

    if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date);
    if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date);
    if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date);

    return mktime(0, 0, 0, $month, $day, $year);

}
Jonathan Roy avatar Jan 17 '2011 01:01 Jonathan Roy

Del artículo de STRTOTIME Nota:

Las fechas en los formatos m/d/y o dmy se eliminan al observar el separador entre los distintos componentes: si el separador es una barra (/), entonces se supone el m/d/y americano; mientras que si el separador es un guión (-) o un punto (.), se asume el formato dmy europeo.

Es tan simple como eso.

L. Smit avatar Oct 10 '2012 08:10 L. Smit