Strtotime() no funciona con el formato dd/mm/AAAA
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/YYYY
formato.
Si tengo la fecha en dd/mm/YYYY
formato, ¿cómo puedo convertirla YYYY-mm-dd
? Puedo hacerlo usando explode()
la función, pero creo que hay mejores soluciones.
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 strtotime
documentació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.
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/Y
se infiere d/m/Y
(pero puede, como se menciona en las respuestas aquí, usar d-m-Y
o d.m.Y
) d\tm\tY
.
En el pasado, también recurrí al método rápido str_replace
mencionado 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);
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);
}
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.