mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-01-03 23:25:20 +00:00
LibCore+LibJS+LibUnicode: Port retrieving time zone offsets to ICU
The changes to tests are due to LibTimeZone incorrectly interpreting
time stamps in the TZDB. The TZDB will list zone transitions in either
UTC or the zone's local time (which is then subject to DST offsets).
LibTimeZone did not handle the latter at all.
For example:
The following rule is in effect until November 18, 6PM UTC.
America/Chicago -5:50:36 - LMT 1883 Nov 18 18:00u
The following rule is in effect until March 1, 2AM in Chicago time. But
at that time, a DST transition occurs, so the local time is actually
3AM.
America/Chicago -6:00 Chicago C%sT 1936 Mar 1 2:00
This commit is contained in:
committed by
Andreas Kling
parent
1b2d47e6bb
commit
672a555f98
@@ -118,4 +118,25 @@ Optional<String> resolve_primary_time_zone(StringView time_zone)
|
||||
return icu_string_to_string(iana_id);
|
||||
}
|
||||
|
||||
Optional<TimeZoneOffset> time_zone_offset(StringView time_zone, UnixDateTime time)
|
||||
{
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
|
||||
auto icu_time_zone = adopt_own_if_nonnull(icu::TimeZone::createTimeZone(icu_string(time_zone)));
|
||||
if (!icu_time_zone || *icu_time_zone == icu::TimeZone::getUnknown())
|
||||
return {};
|
||||
|
||||
i32 raw_offset = 0;
|
||||
i32 dst_offset = 0;
|
||||
|
||||
icu_time_zone->getOffset(static_cast<UDate>(time.milliseconds_since_epoch()), 0, raw_offset, dst_offset, status);
|
||||
if (icu_failure(status))
|
||||
return {};
|
||||
|
||||
return TimeZoneOffset {
|
||||
.offset = Duration::from_milliseconds(raw_offset + dst_offset),
|
||||
.in_dst = dst_offset == 0 ? TimeZoneOffset::InDST::No : TimeZoneOffset::InDST::Yes,
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user