Skip to content

Commit 97745fd

Browse files
authored
Fix validity checks (#523)
The spec only requires *dates* to be checked, not times. While I'm at it, I added some robustness.
1 parent d0b76fa commit 97745fd

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

src/parsers.rs

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -728,19 +728,30 @@ fn parse_ixdtf(source: &[u8], variant: ParseVariant) -> TemporalResult<IxdtfPars
728728
);
729729
}
730730

731+
// Temporal requires parsed dates to be checked for validity at parse time
732+
// https://tc39.es/proposal-temporal/#sec-temporal-iso8601grammar-static-semantics-early-errors
733+
// https://tc39.es/proposal-temporal/#sec-temporal-iso8601grammar-static-semantics-isvaliddate
734+
// https://tc39.es/proposal-temporal/#sec-temporal-iso8601grammar-static-semantics-isvalidmonthday
731735
if let Some(date) = record.date {
732-
if !crate::iso::is_valid_date(date.year, date.month, date.day) {
736+
// ixdtf currently returns always-valid reference years/days
737+
// in these cases (year = 0, day = 1), but we should set our own
738+
// for robustness.
739+
let year = if variant == ParseVariant::MonthDay {
740+
1972
741+
} else {
742+
date.year
743+
};
744+
let day = if variant == ParseVariant::YearMonth {
745+
1
746+
} else {
747+
date.day
748+
};
749+
if !crate::iso::is_valid_date(year, date.month, day) {
733750
return Err(TemporalError::range()
734751
.with_message("DateTime strings must contain a valid ISO date."));
735752
}
736753
}
737754

738-
if let Some(time) = record.time {
739-
if !crate::iso::is_valid_time(time.hour, time.minute, time.second, 0, 0, 0) {
740-
return Err(TemporalError::range()
741-
.with_message("DateTime strings must contain a valid ISO time."));
742-
}
743-
}
744755
Ok(record)
745756
}
746757

0 commit comments

Comments
 (0)