2011-05-02 134 views
2

我看過手冊,這可能是一個轉換古怪,但我無法弄清楚。我正在從用戶那裏獲取一個日期,並嘗試使用PHP(版本4.1)進行驗證(使用strtotime並檢查返回值)。用戶將進入歐洲的日期格式(DMY),但是當我提供這種格式日期的strtotime它是不一致的。例如:PHP strtotime不正確的轉換

2011年3月1日被轉換到第三2008年7月的

我知道該手冊說,連字符或點分隔日期被解釋爲歐洲,但它不在這裏工作。

$startDate=$_GET['start']; 
echo $startDate; 
$timestamp=strtotime($startDate); 
echo $timestamp; 
echo date("d-M-Y",$timestamp); 

從第一回波的輸出爲2011年3月1日(這是正確的 - 用戶輸入的值),所述第二回聲shews時間戳爲1215039600和日期回波shews 03-JUL-2008

+1

你能發表你正在使用的EXACT代碼嗎? – 2011-05-02 21:19:25

+0

PHP 4.1 ftw!這是迄今爲止最好的版本。去1997年! – Rudie 2011-05-02 21:51:42

+0

請使用示例代碼。 – 2011-05-02 22:01:47

回答

3

strtotime是神奇的,但它不是絕對可靠的。如果你想保證一個正確的轉換,你應該使用

$dt = DateTime::CreateFromFormat('d-m-Y', $startDate); 

它可以讓你指定顯式格式的輸入,所以沒有歧義。

不幸的是,這僅僅是PHP 5.3+,而你被困在4.1上。即使strfptime()其作品similary只進來5.1

我強烈建議更新您的PHP版本,因爲4.x已被棄用和不受支持。這就是說,我不明白任何一種轉換歧義會如何將2011年轉換爲2008年。時區差異和日/月奇數會耽誤小時和數月,但不會將事情改變3年。

1

默認情況下,PHP期望那個和number-number-number是Ymd,並從那裏開始向後工作,直到日期有意義。您可能必須更改您的區域設置:http://ca.php.net/manual/en/class.locale.php。這應該修復歐洲日期格式錯誤,但請記住現在相反會成爲問題。

+0

我已經設置了語言環境 - 它沒有區別。 – 2011-05-02 21:43:38

+0

謝天謝地發現這個評論 - 羞愧地認爲這種行爲沒有記錄在任何地方。如果分隔符是短劃線( - )或點(。),則假定歐洲的d-m-y格式_LIES!日期(「d/m/y」,strtotime(「05-03-12」))' - 12/03/05 'date(「d/m/y」,strtotime(「05-03- 2012「))' - 05/03/12 – eithed 2012-02-28 14:29:46