Sono strano con il comportmento di strtotime

Sto ottenendo la data di inizio e alla data utilizzando il plugin jquery datepicker. Quanto segue è l'output di POST.

Array ( [fromDate] => 01/03/2012 [toDate] => 15/03/2012 [hdnDownload] => Download ) 

Sto cercando di convertire questo formato di data in un altro formato di data come questo:

 echo'fromdate'.$fromDate = date("Y/n/j", strtotime($_POST['fromDate'])); echo'todate'.$toDate = date("Y/n/j", strtotime($_POST['toDate'])); 

Mi dà il seguente risultato:

 fromdate: 2012-1-3 todate:1969-12-31 

Il fromDate va bene ma il ToDate è cambiato, puoi aiutarmi per favore.

Probabilmente dovresti usare DateTime::createFromFormat() :

 php > $date = DateTime::createFromFormat('i/n/Y', '15/03/2012'); php > echo $date->format('Y/n/j'); // 2012/3/11 

Questo è utile perché puoi specificare il formato di input. xx/yy/YY può essere rappresentato come i/n/Y e n/i/Y e quindi la data è ambigua => comportmento imprevedibile.

Quello che ti serve per assicurarti di get risultati corretti è DateTime :: createFromFormat () se usi PHP> = 5.3.0, o strptime () con PHP> = 5.1.0, where puoi specificare il formato di input.

Sebbene tu voglia ancora consentire il formato libero, potresti voler creare una stampella, che verrebbe controllata con espressioni regolari per questo particolare formato e usarne uno solo per m / g / Y americano, qualcosa del tipo:

 function parsedate($date) { if (preg_match('#\d{1,2}/\d{1,2}/\d{2,4}#', $date)) { $parsed = strptime($date, '%m/%d/%Y'); return mktime(0, 0, 0, $parsed['tm_mon'], $parsed['tm_mday'], 1900+$parsed['tm_year']); // 'tm_year' is years since 1900 } else { return strtotime($date); } } 

È ancora una stampella, ma non riesco a vedere nessun modo più pulito.

strtotime() può dare risultati imprevisti se l'input non è valido o non è corretto. Sembrerebbe che il tuo $_POST['toDate'] non sia valido per il strtotime funzionamento di strtotime .

La data che ottieni è la data di inizio di Unix Time nel tuo fuso orario.

Suggerirei di usare qualcosa di diverso da strtotime come la class DateTime o la function date() .

Anche il fromDate è sbagliato, in quanto si desidera che il 03 non sia il mese 1.

Nel tuo caso, il tempo stringe a pensare che l'input sia Mese / Giorno / Anno e che 15 non è un mese in cui incasina.

Potresti scambiare le tue stringhe di input con

 [fromDate] => 03/01/2012 [toDate] => 03/15/2012 

oppure usa createFromFormat nella risposta di @ Vyktor.