Strtotime () ne fonctionne pas avec le format jj / mm / AAAA

167

J'aime beaucoup la strtotime()fonction, mais le manuel d'utilisation ne donne pas une description complète des formats de date pris en charge. strtotime('dd/mm/YYYY')ne fonctionne pas, cela fonctionne uniquement avec le mm/dd/YYYYformat.

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

Simon
la source
7
Vous n'avez pas vraiment besoin de le convertir au format "AAAA-mm-jj" pour l'analyser - il vous suffit de le changer en "jj-mm-AAAA", ce qui peut être fait avecstr_replace('/', '-', $date);
Gavin Coates

Réponses:

399

Voici la solution simplifiée:

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

Résultat:

2010-05-25

La strtotimedocumentation lit:

Les dates au format m / j / y ou dmy sont clarifiées en regardant le séparateur entre les différents composants: si le séparateur est une barre oblique ( / ), alors l'américain m / j / y est supposé; alors que si le séparateur est un tiret ( - ) ou un point ( . ), alors le format européen dmy est utilisé .

Trigonométrie
la source
2
@Web Logic Je ne peux pas et comprendre le format par défaut de la fonction strtotime (), si j'écris strtotimr ('01 -01-2010 '), il le comprend au format jj-mm-AAAA ou mm-jj-AAAA?
Simon
3
Si vous le testez avec: echo date('Y-m-l', strtotime('01-01-2010'));Le résultat est 2010-01-Friday. Ainsi, le jour qui vient à la fin dépend de la façon dont vous spécifiez le format de date à la datefonction.
1
Bien que ce que vous avez publié ici soit correct et réponde à la question des utilisateurs, c'est un moyen détourné de résoudre le problème réel. Pour que strtotime () analyse correctement une date au format "jj / mm / aa", vous devez remplacer le "/" par "-". Par conséquent, vous n'avez vraiment besoin que des deux premières lignes de la réponse: $date = '25/05/2010'; $date = str_replace('/', '-', $date); la ligne supplémentaire n'est pas nécessaire pour résoudre votre problème.
Gavin Coates
Ceci n'est correct que si le jour est> 12: $ date = '1/2/34'; // 1er février 2034 echo date ('d M Y', strtotime ($ date)); // 02 janvier 2034
kurdtpage
Merci mon pote. Vraiment fait ma journée.
BEingprabhU
64

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

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

(À part: Le !est utilisé pour réinitialiser les valeurs non spécifiées sur l'horodatage Unix, c'est-à-dire que l'heure sera minuit.)


Si vous ne voulez pas (ou ne pouvez pas) utiliser PHP 5.3, alors une liste complète des formats de date / heure disponibles que strtotime accepte est répertoriée sur la page de manuel des formats de date . Cette page décrit plus à fond le fait que m/d/Yinférée plus d/m/Y(mais vous pouvez, comme mentionné dans les réponses ici, l' utilisation d-m-Y, d.m.You d\tm\tY).


Dans le passé, j'ai également eu recours au quicky str_replacementionné dans une autre réponse, ainsi qu'à l'analyse automatique 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);
salathe
la source
17

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

}
Jonathan Roy
la source
16

À partir de l'écriture STRTOTIME Remarque:

Les dates aux formats m / j / y ou dmy sont clarifiées en regardant le séparateur entre les différents composants: si le séparateur est une barre oblique (/), alors l'américain m / j / y est supposé; alors que si le séparateur est un tiret (-) ou un point (.), alors le format européen dmy est utilisé.

C'est aussi simple que ça.

L. Smit
la source
Nous pouvons l'implémenter car ils ne donneront pas d'erreur, mais lorsque j'ai vérifié $tet que j'ai $t1affiché un résultat différent. J'ai vérifié comme ça. $t=strtotime(date('d-m-Y'));et $t1=strtotime(date('m/d/Y'));
vusan
3

le plus rapide devrait probablement être

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

cela retournera false si le format ne ressemble pas au format correct, mais cela ne vérifiera pas si la date est valide

crâne
la source
2

Je n'ai pas trouvé de meilleure solution. Vous pouvez utiliser explode(), preg_match_all()etc.

J'ai une fonction d'assistance statique comme celle-ci

class Date {

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

    }

}

Il y a probablement un meilleur nom pour cela, mais je l'utilise ausStrToTime()parce qu'il fonctionne avec des dates australiennes (avec lesquelles je travaille souvent, étant australien). Un meilleur nom serait probablement le nom standardisé, mais je ne suis pas sûr de ce que c'est.

Alex
la source
2

J'ai essayé de convertir le format ddmmyy au date("Y-m-d"format mais ne fonctionnait pas lorsque je passe directementddmmyy =date('dmy')

puis réalisé qu'il doit être au format aaaa-mm-jj donc. utilisé sous-chaîne pour organiser

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

puis passé à date("Y-m-d",strtotime($strParam));

ça a marché!

smakintel.com
la source
2

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

Cela fonctionnera pour vous. Vous convertissez la chaîne en un format de date personnalisé où vous pouvez spécifier à PHP quel est le format d'origine de la chaîne qui lui a été donné. Maintenant qu'il s'agit d'un format de date, vous pouvez le convertir au format de date par défaut de PHP, qui est le même que celui utilisé par MySQL.

Fi Horan
la source
solution la plus propre et la plus fine
Marco Marsala
1

Obtenez-vous cette valeur d'une base de données? Si tel est le cas, envisagez de le formater dans la base de données (à utiliser date_formatdans mysql, par exemple). Sinon, l'explosion de la valeur peut être le meilleur pari, car strtotime ne semble tout simplement pas apprécier les valeurs jj / mm / aaaa.

Joseph Mastey
la source
1

Si vous savez que c'est en jj / mm / AAAA, vous pouvez faire:

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

Il correspondra aux dates sous la forme j / m / AA ou jj / mm / AAAA (ou toute combinaison des deux) ...

Si vous souhaitez prendre en charge plus de séparateurs que juste /, vous pouvez changer l'expression régulière en:

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

Et puis ajoutez tous les caractères souhaités dans le [/-]bit (notez que le caractère - doit être le dernier)

ircmaxell
la source
Votre expression régulière devrait sûrement être utilisée \dpour les chiffres décimaux plutôt que [/d]pour la barre oblique ou le caractère d .
salathe
1

Cette solution de contournement est plus simple et plus élégante que d'exploser:

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

Vous n'avez pas besoin de savoir dans quel format vous obtenez la date, mais si elle est accompagnée de barres obliques, elles sont remplacées par des points et elle est traitée comme européenne par strtotime.

user2623027
la source
0

La solution la plus simple est la suivante:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));
simplement_jhen
la source
3
C'est faux. La question est explicitement liée aux entrées jj / mm / aaaa.
Matt Fletcher
0

C'est la solution que j'utilise même si le zéro non significatif est là.

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

 echo $date;
?>
Nandhini
la source
0

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

Nazmulhaqued
la source
0

Aussi simple que ça

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