Combine RFC 822 and RFC 850 patterns

This commit is contained in:
J. King 2020-04-24 13:11:15 -04:00
parent 7ead15501b
commit 418a999ef1
2 changed files with 22 additions and 4 deletions

View file

@ -8,8 +8,7 @@ namespace MensBeam\Lax;
class Date extends \DateTimeImmutable implements \JsonSerializable {
protected const PATTERN_RFC3339 = '/^(\d{4}-\d\d-\d\d)[Tt ](\d\d:\d\d(?::\d\d(?:\.\d+)?)?)\s*([Zz]|[+\-]\d\d:?\d\d)?$/';
protected const PATTERN_RFC822 = '/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun), (\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d\d(?:\d\d)?) (\d\d:\d\d(?::\d\d(?:\.\d+)?)?)\s*([A-Z]|GMT|UTC?|[ECMP][SD]T|[+\-]\d\d:?\d\d)?$/';
protected const PATTERN_RFC850 = '/^(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day, (\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d(?:\d\d)?) (\d\d:\d\d(?::\d\d(?:\.\d+)?)?)\s*([A-Z]|GMT|UTC?|[ECMP][SD]T|[+\-]\d\d:?\d\d)?$/';
protected const PATTERN_RFC8XX = '/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun|(?:Mon|Tues|Wednes|Thurs|Fri|Satur|Sun)day)(?:, ?| )(?|(\d\d) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d\d(?:\d\d)?)|(\d\d)-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)-(\d\d(?:\d\d)?)) (\d\d:\d\d(?::\d\d(?:\.\d+)?)?)\s*(?-i:([A-Z]|GMT|UTC?|[ECMP][SD]T|[+\-]\d\d:?\d\d)?)$/i';
protected const PATTERN_ASCTIME = '/^(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d\d?) (\d\d:\d\d(?::\d\d(?:\.\d+)?)?) (\d{4})$/';
protected const INPUT_FORMAT = '!Y-m-d\TH:i:s.uO';
protected const MICROTIME_PRECSISION = 6;
@ -106,9 +105,9 @@ class Date extends \DateTimeImmutable implements \JsonSerializable {
$date = $match[1];
$time = self::parseTime($match[2]);
$zone = self::parseZone($match[3] ?? "");
} elseif (preg_match(self::PATTERN_RFC822, $timeSpec, $match) || preg_match(self::PATTERN_RFC850, $timeSpec, $match)) {
} elseif (preg_match(self::PATTERN_RFC8XX, $timeSpec, $match)) {
$day = $match[1];
$month = self::MONTH_MAP[$match[2]] ?? null;
$month = self::MONTH_MAP[ucfirst(strtolower($match[2]))] ?? null;
assert(!is_null($month));
$year = $match[3];
$time = self::parseTime($match[4]);

View file

@ -308,3 +308,22 @@ RFC 822 with no time zone:
- 'Thu, 05 Mar 2020 23:08:55 -00:00'
- 'Thu, 05 Mar 2020 23:08:55 J'
output: '2020-03-05T23:08:55-00:00'
RFC 822 far ambiguous date:
input:
- 'Fri, 05 Mar 1999 23:08:55Z'
- 'Fri, 05 Mar 99 23:08:55Z'
output: '1999-03-05T23:08:55+00:00'
RFC 822 accepted syntax variations:
input:
- 'thu, 05 Mar 2020 23:08:55Z'
- 'tHU, 05 Mar 2020 23:08:55Z'
- 'THU, 05 Mar 2020 23:08:55Z'
- 'Thu,05 Mar 2020 23:08:55Z'
- 'Thu 05 Mar 2020 23:08:55Z'
- 'Thu, 05-Mar-2020 23:08:55Z'
- 'Thu, 05 mar 2020 23:08:55Z'
- 'Thu, 05 mAR 2020 23:08:55Z'
- 'Thu, 05 MAR 2020 23:08:55Z'
output: '2020-03-05T23:08:55+00:00'