无法解析`imap_check`日期格式

时间:2014-02-21 14:24:58

标签: php imap

我正在使用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 个答案:

答案 0 :(得分: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)

看起来这可能与标识in this answerT时区解析行为有关,其中时区缩写字符串仅解析为最终)

答案 1 :(得分:1)

p p中的东西是评论。该特定注释命名时区,但是您的解析器应该只是一个注释。

这是一个有效的日期:

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

删除所有评论,您的格式应该没问题。