Question

I'm retrieving the date using imap_check and it's returning a value like:

Fri, 21 Feb 2014 14:02:37 +0000 (GMT)

This doesn't seem to match the docs and I was expecting:

Fri, 21 Feb 2014 14:02:37 +0000

I've attempted to change my format to match the results but neither work:

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

However the two attempts above both return a date of false.

Was it helpful?

Solution

Your second attempt using (T) in parentheses looks to almost have been correct, but it will work by omitting the ():

$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"
}

Why this is though, I cannot find in the documentation. If you do:

echo date('T');
// CST

...you get back the timezone abbreviation without surrounding parentheses. But according to the linked DateTime::createFromFormat() docs, ;, :, /, ., ,, -, ( or ) should be interpreted literally.

Oh, here it gets a little interesting:

// 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)

It appears this could be related to the T timezone parsing behavior identified in this answer, wherein the timezone abbreviation string is parsed only up to the final ).

OTHER TIPS

The stuff in parens is a comment. That particular comment names the timezone, but to your parser that should just be a comment.

This is a valid date:

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

Strip all comments and your format should be fine.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top