diff --git a/src/offset/local/tz_info/rule.rs b/src/offset/local/tz_info/rule.rs index 5e4568279..deebe0ffc 100644 --- a/src/offset/local/tz_info/rule.rs +++ b/src/offset/local/tz_info/rule.rs @@ -272,7 +272,7 @@ impl AlternateTime { } else if local_time >= dst_end_transition_end && local_time <= dst_end_transition_start { - Ok(crate::MappedLocalTime::Ambiguous(self.std, self.dst)) + Ok(crate::MappedLocalTime::Ambiguous(self.dst, self.std)) } else { Ok(crate::MappedLocalTime::Single(self.std)) } @@ -284,7 +284,7 @@ impl AlternateTime { } else if local_time >= dst_end_transition_end && local_time <= dst_end_transition_start { - Ok(crate::MappedLocalTime::Ambiguous(self.std, self.dst)) + Ok(crate::MappedLocalTime::Ambiguous(self.dst, self.std)) } else if local_time > dst_end_transition_end && local_time < dst_start_transition_start { @@ -309,7 +309,7 @@ impl AlternateTime { } else if local_time >= dst_start_transition_end && local_time <= dst_start_transition_start { - Ok(crate::MappedLocalTime::Ambiguous(self.dst, self.std)) + Ok(crate::MappedLocalTime::Ambiguous(self.std, self.dst)) } else if local_time > dst_start_transition_start && local_time < dst_end_transition_start { @@ -337,7 +337,7 @@ impl AlternateTime { } else if local_time >= dst_start_transition_end && local_time <= dst_start_transition_start { - Ok(crate::MappedLocalTime::Ambiguous(self.dst, self.std)) + Ok(crate::MappedLocalTime::Ambiguous(self.std, self.dst)) } else { Ok(crate::MappedLocalTime::Single(self.dst)) } diff --git a/src/offset/local/tz_info/timezone.rs b/src/offset/local/tz_info/timezone.rs index c36b7938a..8b05c3b8b 100644 --- a/src/offset/local/tz_info/timezone.rs +++ b/src/offset/local/tz_info/timezone.rs @@ -238,7 +238,7 @@ impl<'a> TimeZoneRef<'a> { let local_leap_time = local_time; // if we have at least one transition, - // we must check _all_ of them, incase of any Overlapping (MappedLocalTime::Ambiguous) or Skipping (MappedLocalTime::None) transitions + // we must check _all_ of them, in case of any Overlapping (MappedLocalTime::Ambiguous) or Skipping (MappedLocalTime::None) transitions let offset_after_last = if !self.transitions.is_empty() { let mut prev = self.local_time_types[0]; @@ -259,7 +259,8 @@ impl<'a> TimeZoneRef<'a> { } else if local_leap_time >= transition_end && local_leap_time <= transition_start { - if prev.ut_offset < after_ltt.ut_offset { + // Going from local to UTC a bigger offset means an earlier time. + if prev.ut_offset > after_ltt.ut_offset { return Ok(crate::MappedLocalTime::Ambiguous(prev, after_ltt)); } else { return Ok(crate::MappedLocalTime::Ambiguous(after_ltt, prev)); @@ -271,7 +272,8 @@ impl<'a> TimeZoneRef<'a> { if local_leap_time < transition_start { return Ok(crate::MappedLocalTime::Single(prev)); } else if local_leap_time == transition_end { - if prev.ut_offset < after_ltt.ut_offset { + // Going from local to UTC a bigger offset means an earlier time. + if prev.ut_offset > after_ltt.ut_offset { return Ok(crate::MappedLocalTime::Ambiguous(prev, after_ltt)); } else { return Ok(crate::MappedLocalTime::Ambiguous(after_ltt, prev));