Strtotime () non funziona con il formato gg / mm / AAAA


167

Mi piace molto la strtotime()funzione, ma il manuale dell'utente non fornisce una descrizione completa dei formati di data supportati. strtotime('dd/mm/YYYY')non funziona, funziona solo con il mm/dd/YYYYformato.

Se ho una data in dd/mm/YYYYformato, come posso convertirla YYYY-mm-dd? Posso farlo usando la explode()funzione, ma penso che ci siano soluzioni migliori.


7
In realtà non hai bisogno di convertirlo nel formato "AAAA-mm-gg" per analizzarlo - devi solo cambiarlo in "gg-mm-AAAA", che può essere fatto constr_replace('/', '-', $date);
Gavin Coates,

Risposte:


399

Ecco la soluzione semplificata:

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

Risultato:

2010-05-25

La strtotimedocumentazione riporta:

Le date nei formati m / d / y o dmy sono chiarite osservando il separatore tra i vari componenti: se il separatore è una barra ( / ), si assume l'americano m / d / y ; mentre se il separatore è un trattino ( - ) o un punto ( . ), si assume il formato dmy europeo .


2
@Web Logic non riesco a capire il formato predefinito della funzione strtotime (), se scrivo strtotimr ('01 -01-2010 '), lo capisco come formato gg-mm-AAAA o mm-gg-AAAA?
Simon,

3
Se lo provi con: echo date('Y-m-l', strtotime('01-01-2010'));Il risultato è 2010-01-Friday. Quindi il giorno che verrà alla fine, dipende da come si specifica il formato della data per la datefunzione.

1
Mentre quello che hai pubblicato qui è corretto e risponde alla domanda degli utenti, è un modo indiretto di risolvere il problema reale. Affinché strtotime () analizzi correttamente una data nel formato "gg / mm / aa", è necessario sostituire "/" con "-". Quindi hai solo bisogno delle prime due righe della risposta: $date = '25/05/2010'; $date = str_replace('/', '-', $date); la riga aggiuntiva non è necessaria per risolvere il tuo problema.
Gavin Coates,

Questo è corretto solo se il giorno è> 12: $ date = '1/2/34'; // 1 ° febbraio 2034 data dell'eco ('d M Y', strtotime ($ date)); // 02 gennaio 2034
kurdtpage

Grazie compagno. Ha davvero reso la mia giornata.
BEingprabhU,

64

Puoi analizzare le date da un formato personalizzato (a partire da PHP 5.3) con DateTime :: createFromFormat

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

(A parte: !viene utilizzato per ripristinare i valori non specificati nel timestamp di Unix, ovvero l'ora sarà mezzanotte.)


Se non si desidera (o non è possibile) utilizzare PHP 5.3, un elenco completo dei formati di data / ora disponibili che strtotime accetta è elencato nella pagina del manuale Formati di data . Quella pagina si descrivono più a fondo il fatto che m/d/Yviene dedotto nel corso d/m/Y(ma è possibile, come accennato nelle risposte qui, l'uso d-m-Y, d.m.Yo d\tm\tY).


In passato, ho anche fatto ricorso alla rapida str_replacemenzionata in un'altra risposta, oltre a analizzare automaticamente la stringa della data in un altro formato come

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

17

Questa è una buona soluzione a molti problemi:

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

Dalla scrittura STRTOTIME Nota:

Le date nei formati m / d / y o dmy sono chiarite osservando il separatore tra i vari componenti: se il separatore è una barra (/), si assume l'americano m / d / y; mentre se il separatore è un trattino (-) o un punto (.), si assume il formato dmy europeo.

È così semplice.


Possiamo implementarlo in quanto non daranno errori, ma quando ho controllato $te $t1stanno mostrando risultati diversi. Ho controllato in questo modo. $t=strtotime(date('d-m-Y'));e $t1=strtotime(date('m/d/Y'));
vusan,

3

il più veloce dovrebbe probabilmente essere

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

questo restituirà falso se il formato non sembra quello corretto, ma non controllerà se la data è valida


2

Non ho trovato una soluzione migliore. È possibile utilizzare explode(), preg_match_all()ecc

Ho una funzione di supporto statica come questa

class Date {

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

    }

}

Probabilmente esiste un nome migliore per questo, ma lo uso ausStrToTime()perché funziona con le date australiane (di cui mi occupo spesso, essendo australiana). Un nome migliore sarebbe probabilmente il nome standardizzato, ma non sono sicuro di cosa si tratti.


2

Ho provato a convertire il formato ddmmyy in date("Y-m-d"formato ma non funzionava quando ho passato direttamenteddmmyy =date('dmy')

poi ho capito che doveva essere così nel formato aaaa-mm-gg. usato sottostringa per organizzare

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

poi passato a date("Y-m-d",strtotime($strParam));

ha funzionato!


2

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

Questo funzionerà per te. Converti la stringa in un formato data personalizzato in cui puoi specificare in PHP quale formato originale della stringa è stato assegnato. Ora che è un formato data, puoi convertirlo nel formato data predefinito di PHP, che è lo stesso usato da MySQL.


soluzione più pulita e migliore
Marco Marsala,

1

Stai ottenendo questo valore da un database? In tal caso, considerare la formattazione nel database (utilizzare date_formatad esempio in mysql). Altrimenti, esplodere il valore può essere la scommessa migliore, dato che lo strtotime non sembra apprezzare i valori gg / mm / aaaa.


1

Se sai che è in gg / mm / AAAA, puoi fare:

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

Abbinerà le date nella forma g / m / AA o gg / mm / AAAA (o qualsiasi combinazione delle due) ...

Se si desidera supportare più separatori rispetto a solo /, è possibile modificare regex in:

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

E quindi aggiungi tutti i caratteri che vuoi nel [/-]bit (Nota, il carattere - deve essere l'ultimo)


Sicuramente il tuo regex dovrebbe usare \dper le cifre decimali piuttosto che [/d]per la barra o il carattere d .
salathe

1

Questa soluzione alternativa è più semplice ed elegante che esplodere:

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

Non devi sapere in quale formato stai ottenendo la data, ma se si tratta di barre vengono sostituite con punti e viene trattata come europea da strtotime.


0

La soluzione più semplice è questa:

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

3
Questo è sbagliato. La domanda è esplicitamente correlata agli input gg / mm / aaaa.
Matt Fletcher,

0

Questa è la soluzione che sto usando anche se ci sono gli zero iniziali.

<?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

Semplice come questo

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.