diff --git a/src/builtins/compiled/zoneddatetime.rs b/src/builtins/compiled/zoneddatetime.rs index 3c7412d01..3de1fd63b 100644 --- a/src/builtins/compiled/zoneddatetime.rs +++ b/src/builtins/compiled/zoneddatetime.rs @@ -389,7 +389,8 @@ impl ZonedDateTime { mod tests { use super::ZonedDateTime; use crate::options::{ - Disambiguation, DisplayCalendar, DisplayOffset, DisplayTimeZone, OffsetDisambiguation, Unit, + DifferenceSettings, Disambiguation, DisplayCalendar, DisplayOffset, DisplayTimeZone, + OffsetDisambiguation, RoundingMode, Unit, }; use crate::provider::TransitionDirection; use crate::Calendar; @@ -922,4 +923,23 @@ mod tests { .unwrap(); assert_eq!(next.to_string(), TROLL_FIRST_TRANSITION); } + + #[test] + fn test_zdt_until_rounding() { + // Regression test for beyondDaySpan rounding behavior + let start = parse_zdt_with_reject("2020-01-01T00:00-08:00[-08:00]").unwrap(); + let end = parse_zdt_with_reject("2020-01-03T23:59-08:00[-08:00]").unwrap(); + let difference = start + .until( + &end, + DifferenceSettings { + largest_unit: Some(Unit::Day), + smallest_unit: Some(Unit::Hour), + rounding_mode: Some(RoundingMode::HalfExpand), + ..Default::default() + }, + ) + .unwrap(); + assert_eq!(difference.to_string(), "P3D"); + } } diff --git a/src/builtins/core/duration/normalized.rs b/src/builtins/core/duration/normalized.rs index f83337bb5..0b4ac0362 100644 --- a/src/builtins/core/duration/normalized.rs +++ b/src/builtins/core/duration/normalized.rs @@ -684,7 +684,7 @@ impl NormalizedDurationRecord { // a. Let didRoundBeyondDay be true. // b. Let dayDelta be sign. // c. Set roundedTimeDuration to ? RoundTimeDurationToIncrement(beyondDaySpan, increment × unitLength, roundingMode). - let rounded_time = self.norm.round_inner( + let rounded_time = beyond_day_span.round_inner( unit_length .checked_mul(options.increment.as_extended_increment()) .temporal_unwrap()?,