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.

Simón
fuente
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 .

Trigonometría
fuente
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);
salathe
fuente
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);

}
Jonathan Roy
fuente
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.

L. Smit
fuente
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

calaveras
fuente
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.

alex
fuente
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ó!

smakintel.com
fuente
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.

Fi Horan
fuente
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.

Joseph Mastey
fuente
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)

ircmaxell
fuente
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.

usuario2623027
fuente
0

La solución más simple es esta:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));
simplemente_jhen
fuente
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;
?>
Nandhini
fuente
0

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

nazmulhaqued
fuente
0

Tan simple como esto

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Prajwol KC
fuente