function parse_date($dt, $rfc822_tz = true)
{
static $cache = array();
if (!isset($cache[$dt][$rfc822_tz])) {
$dt = SimplePie_Misc::uncomment_rfc822($dt);
/*
Capturing subpatterns:
1: RFC 822 date
2: RFC 822 day
3: RFC 822 month
4: RFC 822 year
5: ISO 8601 date
6: ISO 8601 century
7: ISO 8601 year
8: ISO 8601 month
9: ISO 8601 day
10: ISO 8601 ordinal day
11: ISO 8601 month
12: ISO 8601 day
13: ISO 8601 week
14: ISO 8601 day of week
15: Time
16: Hour
17: Hour Decimal
18: Minute
19: Minute Decimal
20: Second
21: Second Decimal
22: Timezone
23: Diff ±
24: Hour
25: Hour Decimal
26: Minute
27: Minute Decimal
28: Alphabetic Timezone
*/
if (preg_match('/^(?:(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun)[,\\s]+)?(([0-9]{1,2})\\s*(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s*([0-9]{4}|[0-9]{2}))|(([0-9]{2})(?:([0-9]{2})(?:(?:-|\\s)*(?:([0-9]{2})([0-9]{2})|([0-9]{3})|([0-9]{2})(?:(?:-|\\s)*([0-9]{2}))?|W([0-9]{2})(?:(?:-|\\s)*([0-9]))?))?)?))((?:T|\\s)+([0-9]{2})(?:(?:,|\\.)([0-9]*)|(?:\\:|\\s)*([0-9]{2})(?:(?:,|\\.)([0-9]*)|(?:\\:|\\s)*([0-9]{2})(?:(?:,|\\.)([0-9]*))?)?)?(?:\\s)*((?:(\\+|-)([0-9]{2})(?:(?:,|\\.)([0-9]*)|(?:\\:|\\s)*(?:([0-9]{2})(?:(?:,|\\.)([0-9]*))?))?)|(UTC|GMT|EST|CST|MST|PST|EDT|CDT|MDT|PDT|UT|[A-IK-Z]))?)?$/i', $dt, $match)) {
// Fill all matches
for ($i = count($match); $i <= 28; $i++) {
$match[$i] = '';
}
// Set blank vars
$year = 1970;
$month = 1;
$day = 1;
$hour = 0;
$minute = 0;
$second = 0;
$timezone = false;
// RFC 822
if ($match[1] !== '') {
if (strlen($match[4]) == 2) {
$year = $match[4] < 70 ? "20{$match['4']}" : "19{$match['4']}";
} else {
$year = $match[4];
}
switch (strtolower($match[3])) {
case 'jan':
$month = 1;
break;
case 'feb':
$month = 2;
break;
case 'mar':
$month = 3;
break;
case 'apr':
$month = 4;
break;
case 'may':
$month = 5;
break;
case 'jun':
$month = 6;
break;
case 'jul':
$month = 7;
break;
case 'aug':
$month = 8;
break;
case 'sep':
$month = 9;
break;
case 'oct':
$month = 10;
break;
case 'nov':
$month = 11;
break;
case 'dec':
$month = 12;
break;
}
$day = $match[2];
} else {
// Year
if ($match[7] !== '') {
$year = "{$match['6']}{$match['7']}";
// Two Digit Month/Day
if ($match[11] !== '') {
$month = $match[11];
if ($match[12] !== '') {
$day = $match[12];
}
} elseif ($match[8] !== '') {
$month = $match[8];
$day = $match[9];
} elseif ($match[10] !== '') {
$day = $match[10];
} elseif ($match[13] !== '') {
// Week Day
if ($match[14] !== '') {
$day = $match[14];
}
$first_day_of_year = date('w', mktime(0, 0, 0, 1, 1, $year));
if ($first_day_of_year == 0) {
$first_day_of_year = 7;
}
$day = 7 * ($match[13] - 1) + $day - ($first_day_of_year - 1);
}
} else {
$year = "{$match['6']}00";
}
}
// Time
if ($match[15] !== '') {
$time = 0;
$time += ($match[16] + ('.' . $match[17])) * 3600;
$time += ($match[18] + ('.' . $match[19])) * 60;
$time += $match[20] + ('.' . $match[21]);
$hour = floor($time / 3600);
$time -= $hour * 3600;
$minute = floor($time / 60);
$time -= $minute * 60;
$second = round($time);
// Timezone
if ($match[22] !== '') {
// Alphabetic Timezone
if ($match[28] !== '') {
// Military
if (strlen($match[28]) == 1) {
if ($match[28] == 'Z' || $match[28] == 'z' || !$rfc822_tz) {
$timezone = 0;
} else {
$timezone = ord(strtoupper($match[28]));
if ($timezone > 74) {
$timezone--;
}
if ($timezone <= 76) {
$timezone = -($timezone - 64);
} else {
$timezone -= 76;
}
$timezone *= 3600;
}
} else {
switch (strtoupper($match[28])) {
case 'UT':
case 'UTC':
case 'GMT':
$timezone = 0;
break;
case 'EST':
$timezone = -18000;
break;
case 'CST':
$timezone = -21600;
break;
case 'MST':
$timezone = -25200;
break;
case 'PST':
$timezone = -28800;
break;
case 'EDT':
$timezone = -14400;
break;
case 'CDT':
$timezone = -18000;
break;
case 'MDT':
$timezone = -21600;
break;
case 'PDT':
$timezone = -25200;
break;
}
}
} else {
$timezone = 0;
$timezone += ($match[24] + ('.' . $match[25])) * 3600;
$timezone += ($match[26] + ('.' . $match[27])) * 60;
$timezone = (int) round($timezone);
if ($match[23] == '-') {
$timezone = -$timezone;
}
}
}
}
if ($timezone === false) {
$cache[$dt][$rfc822_tz] = mktime($hour, $minute, $second, $month, $day, $year);
} else {
$cache[$dt][$rfc822_tz] = gmmktime($hour, $minute, $second, $month, $day, $year) - $timezone;
}
} elseif (($time = strtotime($dt)) > 0) {
$cache[$dt][$rfc822_tz] = $time;
} else {
$cache[$dt][$rfc822_tz] = false;
}
}
return $cache[$dt][$rfc822_tz];
}