2010-05-23 17 views
121

Me gusta mucho la función strtotime(), pero el manual del usuario no proporciona una descripción completa de los formatos de fecha admitidos. strtotime('dd/mm/YYYY') no funciona, funciona solo con el formato mm/dd/YYYY.Strtotime() no funciona con el formato dd/mm/YYYY

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

+5

En realidad, no necesita convertirlo al formato "AAAA-mm-dd" para analizarlo; solo tiene que cambiarlo a "dd-mm-YYYY", lo que se puede hacer con 'str_replace ('/ ',' - ', $ date); ' –

Respuesta

292

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 

The strtotime documentation lee:

fechas en el m/d/y o r d-m-y formatos son desambiguadas mirando el separador entre los diversos componentes: si el separador es una barra (/), entonces la American m/d/y se supone; mientras que si el separador es un guión (-) o un punto (.), entonces se supone que el Europea d-m-y formato.

+1

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

+3

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

+1

Si bien lo que ha publicado aquí es correcto y responde 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 "/" por "-". 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. –

1

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

tengo una función auxiliar estático como sigue

class Date { 

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

    } 

} 

Es probable que haya un mejor nombre para eso, pero yo uso ausStrToTime() porque trabaja con fechas de Australia (que yo a menudo se trata, siendo un australiano). Un nombre mejor sería probablemente el nombre estandarizado, pero no estoy seguro de qué es eso.

0

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

+0

no, es el valor de jquery calendar – Simon

0

Si sabe que es dd/mm/aaaa, que 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); 

que coincidirá con las fechas en el formulario d/m/aa o dd/mm/aaaa (o cualquier combinación de los dos)...

Si quieres apoyar más separadores que apenas /, puede cambiar la expresión regular a:

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

Y a continuación, añadir los caracteres que quiera en el [/-] bits (Nota, el carácter - es necesario que haya pasado)

+0

Seguramente su expresión regular debería estar utilizando '\ d' para dígitos decimales en lugar de' [/ d] 'para * adelante-barra ob el carácter *. – salathe

52

puede analizar data de un formato personalizado (a partir de PHP 5.3) con DateTime::createFromFormat

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

(a lado: El ! se usa para restablecer valores no especificados a la marca de tiempo Unix, es decir. el tiempo será la medianoche.)


Si no quiere (o no puede) usar PHP 5.3, a continuación, una lista completa de los formatos de fecha/hora disponibles que strtotime acepta que se indica en la página del manual Date Formats. Esa página describe más detalladamente el hecho de que m/d/Y se infiere en d/m/Y (pero puede, como se menciona en las respuestas aquí, usar d-m-Y, d.m.Y o d\tm\tY).


En el pasado, yo también he recurrido a la QUICKY str_replace mencionado en otra respuesta, así como la auto-análisis de la cadena de fecha a otro formato como

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

La solución más sencilla es la siguiente :

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

Esto está mal. La pregunta está explícitamente relacionada con las entradas dd/mm/aaaa. –

8

Ésta es una buena solución a 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); 

} 
+0

Puede agregar o eliminar formatos según sus necesidades. –

2

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á false si el formato no se ve como el apropiado, pero no lo puedo-comprobado si la fecha es válida

13

Desde el strtotime writeup Nota :

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

Es así de simple.

+0

Podemos implementar eso, ya que no darán error, pero cuando marqué '$ t' y' $ t1' muestran resultados diferentes. Lo revisé así '$ t = strtotime (date ('d-m-Y'));' y '$ t1 = strtotime (date ('m/d/Y'));' – vusan

0

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

Usted no tiene que saber qué formato que está recibiendo la fecha, pero si viene con barras que se reemplacen por puntos y aparte y es tratado como europeo por strtotime.

1

Me trataron de convertir el formato ddmmaa a date("Y-m-d" formato, pero no estaba funcionando cuando pase directamente ddmmyy =date('dmy')

entonces se dio cuenta de que tiene que estar en formato aaaa-mm-dd manera. subcadena utilizan para organizar

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

después se pasan al date("Y-m-d",strtotime($strParam));

funcionó!

0

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

Esto funcionará para usted. Convierta 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 asignado. Ahora que es un formato de fecha, puede convertirlo al formato de fecha predeterminado de PHP, que es el mismo que utiliza MySQL.

Cuestiones relacionadas