181 votes

La fonction Strtotime() ne fonctionne pas avec jj/mm/AAAA

J'aime vraiment l' strtotime() de la fonction, mais le manuel de l'utilisateur ne donne pas une description complète de la prise en charge des formats de date. La fonction Strtotime('dd/mm/YYYY') ne fonctionne pas, il ne fonctionne qu'avec jj/mm/AAAA.

Si j'ai une date en dd/mm/YYYY format, comment puis-je convertir au format AAAA-mm-jj? Je peux le faire en utilisant explode() de la fonction, mais je pense qu'il y a de meilleures solutions.

69voto

salathe Points 26305

Vous pouvez analyser des dates à partir d'un format personnalisé (PHP 5.3) avec DateTime::createFromFormat

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

(Aparté: L' ! est utilisé pour réinitialiser les non-valeurs spécifiées pour le timestamp Unix, c'est à dire. le temps sera minuit.)


Si vous ne voulez pas (ou ne peut) pas utiliser de PHP 5.3, puis une liste complète des formats de date/heure qui strtotime accepte est inscrite à la Date de Formats de page de manuel. Cette page décrit minutieusement le fait qu' m/d/Y est déduit sur d/m/Y (mais vous pouvez, comme mentionné dans les réponses ici, utilisez d-m-Y, d.m.Y ou d\tm\tY).


Dans le passé, j'ai aussi eu recours à la quicky str_replace mentionné dans une autre réponse, ainsi que l'auto-analyse de la chaîne de date dans un autre format, comme

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

21voto

Jonathan Roy Points 185

C'est une bonne solution à de nombreux problèmes:

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

}

16voto

L. Smit Points 81

À partir de la fonction STRTOTIME writeup Note:

Les Dates dans le m/d/y ou d-mes formats sont analysées en regardant le séparateur entre les différents composants: si le séparateur est un slash (/), puis l'Américain m/d/y est supposé; que, si le séparateur est un tiret (-) ou un point (.), puis Européennes d-mon format est pris en charge.

C'est aussi simple que cela.

3voto

skullnobrains Points 21

plus rapide devrait probablement être

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

cela renvoie false si le format ne ressemble pas à la bonne, mais il l'habitude de-vérifier si la date est valide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X