2011-09-21 146 views
4

我試圖做一些聰明的事情,以解析任何國際格式的日期。如何解析任何日期格式

在我的前端,我使用jQuery UI作爲日期選擇器,每種語言都有其特定的日期格式。

FR:d/M/Y 恩:M/d/Y ...

確定的,但現在對PHP的一部分,我必須存儲使用相同的格式(Mysql的Y-M-d)的日期。我想避免使用開關盒和類似的東西,所以我開始尋找另一種選擇。

我發現的最好的事情是

http://www.php.net/manual/en/datetime.createfromformat.php這個功能將使我能夠解析日期,如果我知道的格式。

例如

$format = 'Y-m-d'; 
$date = DateTime::createFromFormat($format, '2009-02-15'); 

好了,所以這是一個良好的開端,但現在我想找到當前區域設置的標準日期格式。

所以我發現這一點:

http://www.php.net/manual/en/intldateformatter.getpattern.php

但我真的不知道如何得到它的工作,因爲我得到inconstitent結果:

php > $i = new IntlDateFormatter("fr_FR.utf8",IntlDateFormatter::SHORT,IntlDateFormatter::NONE); 
php > echo $i->getPattern(); 
dd/MM/yy 
/* correct ! */ 

php > $i = new IntlDateFormatter("en_US.utf8",IntlDateFormatter::SHORT,IntlDateFormatter::NONE); 
php > echo $i->getPattern();              
M/d/yy /* wtf */ 

我錯過了什麼嗎?

謝謝

+8

在某個時候,你必須放下自己的腳,自己決定一種格式。或者你最終會試圖弄清楚1/2/3是什麼。 03年2月1日? 01年2月3日? '02年3月1日?等等等等等等。很高興嘗試和適應,但有時你必須堅持要求事物具有某種格式。 –

+0

將被存儲的格式將採用特定的格式,但我需要解析用戶傳遞的日期。 –

+2

是的,但是,如果您允許用戶使用1/2/3等內容,則無法可靠地解析該內容。就像我說的那樣,對投入靈活一點都很好,而且在某種程度上,堅持固定格式更容易,而不是試圖讓自己變成一個結。 –

回答

1

沒有「通用日期格式符號標準」。取決於來源,符號「y」可以是2位數年份,4位數年份,或者甚至是3個字母的縮寫月份(極不可能)。

IntlDateFormatter的格式符號記錄爲here。從文檔中可以看到,對於此實現,「d」是沒有前導零的日期,而「dd」包含前導零。 「M」和「MM」代表具有前導零的月份。 「yy」是兩位數的年份。

這個和jQuery UI的日期格式符號有足夠的區別,您需要一個數據映射將IntlDateFormatter格式的符號映射到jQuery UI datepicker format symbols,反之亦然。

像這樣的東西應該是足夠了(未經測試):

// PHP => jQuery 
$formatMap = array(
    'dd' => 'dd', 
    'd' => 'd', 
    'MM' => 'mm', 
    'M' => 'mm', 
    'yy' => 'y' 
    // and so on... 
); 

一旦你有你的地圖設置,你可以創建你IntlDateFormatter基於區域,轉換該格式的符號到jQuery UI的日期格式符號,並然後將格式發送到前端。

當用戶回發選定的日期時,您可以按照相同的步驟返回到IntlDateFormatter符號。此時,您可以使用IntlDateFormatter::setPattern()的組合將格式設置爲MySQL樣式,並使用datefmt_format()(或同等格式)來實際設置發佈日期的格式。

希望這會有所幫助。