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


167

Realmente me gusta la strtotime()función, pero el manual del usuario no proporciona 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 la explode()función, pero creo que hay mejores soluciones.


77
En realidad no es necesario convertirlo a formato "AAAA-MM-DD" para analizarlo - sólo tiene que cambiarlo a "dd-mm-AAAA", que se puede hacer constr_replace('/', '-', $date);
Gavin Coates

Respuestas:


399

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 desambiguan al observar el separador entre los diversos componentes: si el separador es una barra oblicua ( / ), entonces se supone el m / d / y estadounidense ; mientras que si el separador es un guión ( - ) o un punto ( . ), entonces se supone el formato dmy europeo .


2
@Web Logic no puedo entender el formato predeterminado de la función strtotime (), si escribo strtotimr ('01 -01-2010 '), ¿lo entiendo como formato dd-mm-AAAA o mm-dd-AAAA?
Simon

3
Si lo prueba con: echo date('Y-m-l', strtotime('01-01-2010'));El resultado es 2010-01-Friday. Entonces, el día que viene al final, depende de cómo especifique el formato de fecha para la datefunción.

1
Si bien lo que ha publicado aquí es correcto y responde a la pregunta de los usuarios, es una forma indirecta de resolver el problema real. Para que strtotime () analice correctamente una fecha en el formato "dd / mm / aa", debe reemplazar "/" con "-". Por lo tanto, solo necesita las dos primeras líneas de la respuesta: $date = '25/05/2010'; $date = str_replace('/', '-', $date); la línea adicional no es necesaria para resolver su problema.
Gavin Coates

Esto solo es correcto si el día es> 12: $ date = '1/2/34'; // 1 de febrero de 2034 echo date ('d M Y', strtotime ($ date)); // 02 de enero de 2034
kurdtpage

Gracias amigo. Realmente me alegró el día.
BEingprabhU

64

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á la medianoche).


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


En el pasado, también recurrí a la rápida str_replacemencionada en otra respuesta, así como a analizar 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);

17

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

}

16

De la nota de escritura de STRTOTIME:

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

Es tan simple como eso.


Podemos implementar eso, ya que no darán error, pero cuando lo verifiqué $ty $t1muestran un resultado diferente. Lo comprobé así. $t=strtotime(date('d-m-Y'));y $t1=strtotime(date('m/d/Y'));
vusan

3

más rápido probablemente debería ser

false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))

esto devolverá falso si el formato no se ve como el correcto, pero no verificará si la fecha es válida


2

No he encontrado una mejor solución. Se puede utilizar explode(), preg_match_all()etc.

Tengo una función auxiliar estática como esta

class Date {

    public static function ausStrToTime($str) {
        $dateTokens = explode('/', $str);
        return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); 

    }

}

Probablemente haya un mejor nombre para eso, pero lo uso ausStrToTime()porque funciona con fechas australianas (que a menudo trato con ser australiano). Un nombre mejor probablemente sería el nombre estandarizado, pero no estoy seguro de qué es.


2

Traté de convertir el formato ddmmyy a date("Y-m-d"formato pero no estaba funcionando cuando paso directamenteddmmyy =date('dmy')

entonces me di cuenta de que tiene que estar en formato aaaa-mm-dd así. subcadena utilizada para organizar

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

luego pasó a date("Y-m-d",strtotime($strParam));

¡funcionó!


2

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

Esto funcionará para ti. Convierte la Cadena en un formato de fecha personalizado donde puede especificar a PHP cuál es el formato original de la Cadena que se le ha dado. Ahora que es un formato de fecha, puede convertirlo al formato de fecha predeterminado de PHP, que es el mismo que utiliza MySQL.


solución más limpia y fina
Marco Marsala

1

¿Obtiene este valor de una base de datos? Si es así, considere formatearlo en la base de datos (use date_formaten mysql, por ejemplo). De lo contrario, explotar el valor puede ser la mejor opción, ya que el tiempo de ejecución simplemente no parece apreciar los valores dd / mm / aaaa.


1

Si sabe que está en dd / mm / AAAA, puede hacer:

    $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#';
    $match = array();
    if (preg_match($regex, $date, $match)) {
        if (strlen($match[3]) == 2) {
            $match[3] = '20' . $match[3];
        }
        return mktime(0, 0, 0, $match[2], $match[1], $match[3]);
    }
    return strtotime($date);

Coincidirá con las fechas en la forma d / m / AA o dd / mm / AAAA (o cualquier combinación de ambas) ...

Si desea admitir más separadores que solo /, puede cambiar la expresión regular a:

    $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#';

Y luego agregue los caracteres que desee en el [/-]bit (Nota: el carácter - debe ser el último)


Seguramente, su expresión regular debería usarse \dpara dígitos decimales en lugar de [/d]para barra diagonal o carácter d .
salathe

1

Esta solución es más simple y más elegante que explotar:

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

No tiene que saber en qué formato está obteniendo la fecha, pero si viene con barras inclinadas, se reemplazan con puntos y se trata como europeo durante el tiempo de ejecución.


0

La solución más simple es esta:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));

3
Esto está mal. La pregunta está explícitamente relacionada con las entradas dd / mm / aaaa.
Matt Fletcher el

0

Esta es la solución que estoy usando incluso si el cero inicial está ahí.

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>

0

$ date_info = '20 / 02/2019 '; echo date ('Ym-d', strtotime (str_replace ('/', '-', $ date_info)));


0

Tan simple como esto

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.