2012-03-11 77 views
1

我得到的日期和日期使用jQuery的datepicker插件。以下是POST的輸出。我很奇怪的strtotime行爲

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

我想這個日期格式轉換爲另一種日期格式是這樣的:

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

它給了我下面的輸出:

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

沒有fromdate是不錯,但TODATE已經改變了,你能幫我嗎。

+0

strtotime有時表現出奇怪的行爲..畢竟有這麼多的日期時間格式。 mm/dd/yyyy,dd/mm/yyyy等,你能告訴我什麼05/04/2012 vs 04/05/2012是?沒有格式,你不能說出我在談論哪個日期。你可能想嘗試手動反編譯你的日期格式,如果strtotime對你來說效果不好,比如我在這裏:http://stackoverflow.com/questions/9568407/i-want-to-add-100-years-to-在顯示的 - WordPress的-日期/ 9568726#9568726 – 2012-03-11 15:57:00

回答

0

strtotime()如果輸入無效或格式錯誤,可能會給出意想不到的結果。看起來您的$_POST['toDate']strtotime無效,無法正常運行。

您獲得的日期是您所在時區的開始日期Unix Time

我會建議使用strtotime以外的東西,如DateTime類或date()函數。

2

你應該使用DateTime::createFromFormat()

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

這是有用的,因爲你可以指定輸入格式。 xx/yy/YY可表示爲i/n/Yn/i/Y,因此日期不明確=>不可預知的行爲。

2

如果您使用PHP> = 5.3.0或strptime()且PHP> = 5.1.0,您可以指定輸入格式,則需要確保獲得正確結果的是DateTime::createFromFormat()

但如果你仍然要允許自由格式那裏,你可能想使一個柺杖,將與正則表達式檢查這種特定的格式,並使用其中的一個僅適用於美國M/d/Y,是這樣的:

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

它仍然是一個柺杖,但我看不到任何更清潔的方式。

0

沒有fromdate也錯了,因爲你想03是一個月沒有1

在你的情況的strtotime在想輸入的是月/日/年和15月不就攪亂。

你既可以交換你的輸入字符串

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

或@ Vyktor的答案使用createFromFormat。