2014-02-21 145 views
1

我使用imap_check檢索的日期和它的返回值,如:無法解析`imap_check`日期格式

週五,2014年2月21日14時02分37秒+0000(GMT)

這似乎並不匹配的文檔,我期待:

週五,2014年2月21日14時02分37秒+0000

我試圖改變我的格式相匹配的結果,但沒有工作:

//Old RFC2822 format 
$date = DateTime::createFromFormat('D, d M Y H:i:s O',$dateString); 

//Using timezone abbrev 
$date = DateTime::createFromFormat('D, d M Y H:i:s O (T)',$dateString); 

//Using timezone identifier 
$date = DateTime::createFromFormat('D, d M Y H:i:s O (e)',$dateString); 

但是兩個以上的嘗試都返回false日期。

回答

2

在括號中使用(T)你的第二次嘗試看起來幾乎已經是正確的,但它會通過省略()工作:

$d = DateTime::createFromFormat('D, d M Y H:i:s O T', 'Fri, 21 Feb 2014 14:02:37 +0000 (GMT)'); 
//-----------------------------------------------^^^ 
var_dump($d); 
class DateTime#3 (3) { 
    public $date => 
    string(19) "2014-02-21 14:02:37" 
    public $timezone_type => 
    int(2) 
    public $timezone => 
    string(3) "GMT" 
} 

這是爲什麼,雖然,I cannot find in the documentation。如果你這樣做:

echo date('T'); 
// CST 

...你找回沒有包圍括號的時區縮寫。但根據鏈接的DateTime::createFromFormat()文檔,;, :, /, ., ,, -, (or)應按字面解釋。

哦,這裏就有點耐人尋味:

// Works!! 
$d = DateTime::createFromFormat('D, d M Y H:i:s O (T', 'Fri, 21 Feb 2014 14:02:37 +0000 (GMT)'); 
//-----------------------------------------------^^^ Open but no close) 
var_dump($d); 
class DateTime#6 (3) { 
    public $date => 
    string(19) "2014-02-21 14:02:37" 
    public $timezone_type => 
    int(2) 
    public $timezone => 
    string(3) "GMT" 
} 

// Fails!! 
$d = DateTime::createFromFormat('D, d M Y H:i:s O (T)', 'Fri, 21 Feb 2014 14:02:37 +0000 (GMT)'); 
// -----------------------------------------------^^^^ open and close() 
var_dump($d); 
bool(false) 

看來這可能是有關T時區解析行爲確定in this answer,其中,時區縮寫字符串被解析只到最後)

+0

可能與'T'解析錯誤詳細[在這個答案](http://stackoverflow.com/questions/8987782/datetime-formatting-and-timezone) –

1

parens中的東西是一條評論。該特定評論將時區命名,但對於應該只是註釋的解析器而言。

這是一個有效日期:

Sun (Dimanche), (trente-un) 31 (march) Mar (mille-neuf-cent-quatre-vingt-seize) 1996 (tres bon) 15():(bla)53:(blah)10 +0200 (WET) 

地帶的所有意見和您的格式應該罰款。