diff --git a/src/Parser/IsoParsers.php b/src/Parser/IsoParsers.php index d4545dd..81f835a 100644 --- a/src/Parser/IsoParsers.php +++ b/src/Parser/IsoParsers.php @@ -206,7 +206,7 @@ public static function monthDay(): PatternParser } /** - * Returns a parser for a time-zone offset such as `Z` or `+01:00`. + * Returns a parser for a time-zone offset such as `Z`, `+01`, `+01:00`, `+01:00:00`. */ public static function timeZoneOffset(): PatternParser { @@ -220,8 +220,10 @@ public static function timeZoneOffset(): PatternParser ->startGroup() ->appendCapturePattern('[\-\+]', TimeZoneOffsetSign::NAME) ->appendCapturePattern(TimeZoneOffsetHour::PATTERN, TimeZoneOffsetHour::NAME) + ->startOptional() ->appendLiteral(':') ->appendCapturePattern(TimeZoneOffsetMinute::PATTERN, TimeZoneOffsetMinute::NAME) + ->endOptional() ->startOptional() ->appendLiteral(':') ->appendCapturePattern(TimeZoneOffsetSecond::PATTERN, TimeZoneOffsetSecond::NAME) diff --git a/src/TimeZoneOffset.php b/src/TimeZoneOffset.php index a9ac434..51933ec 100644 --- a/src/TimeZoneOffset.php +++ b/src/TimeZoneOffset.php @@ -106,7 +106,7 @@ public static function from(DateTimeParseResult $result): TimeZoneOffset } $hour = $result->getField(Field\TimeZoneOffsetHour::NAME); - $minute = $result->getField(Field\TimeZoneOffsetMinute::NAME); + $minute = $result->getOptionalField(Field\TimeZoneOffsetMinute::NAME); $second = $result->getOptionalField(Field\TimeZoneOffsetSecond::NAME); $hour = (int) $hour; @@ -128,6 +128,7 @@ public static function from(DateTimeParseResult $result): TimeZoneOffset * The following ISO 8601 formats are accepted: * * * `Z` - for UTC + * * `±hh` * * `±hh:mm` * * `±hh:mm:ss` * diff --git a/tests/TimeZoneOffsetTest.php b/tests/TimeZoneOffsetTest.php index ad8fb38..b484dfc 100644 --- a/tests/TimeZoneOffsetTest.php +++ b/tests/TimeZoneOffsetTest.php @@ -152,6 +152,13 @@ public function testParse(string $text, int $totalSeconds): void public static function providerParse(): iterable { yield from [ + ['+00', 0], + ['-00', 0], + ['+01', 3600], + ['-01', -3600], + ['+18', 64800], + ['-18', -64800], + ['+00:00', 0], ['-00:00', 0], ['+01:00', 3600], @@ -182,7 +189,6 @@ public static function providerParseInvalidStringThrowsException(): array return [ [''], ['00:00'], - ['+00'], ['+00:'], ['+00:00:'], ['+1:00'],