1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-01 09:18:11 +00:00

LibTimeZone: Operate in UTC-only mode when !ENABLE_TIME_ZONE_DATA

Instead of only having dummy functions that don't work with any input,
let's at least support one time zone: 'UTC'. This matches the basic
Temporal implementation for engines without ECMA-262, for example.
This commit is contained in:
Linus Groh 2022-01-11 20:16:15 +01:00
parent f1276144ba
commit 205d63c3f0
2 changed files with 58 additions and 3 deletions

View file

@ -126,4 +126,24 @@ TEST_CASE(get_time_zone_offset)
EXPECT(!TimeZone::get_time_zone_offset("I don't exist"sv, {}).has_value());
}
#else
TEST_CASE(time_zone_from_string)
{
EXPECT_EQ(TimeZone::time_zone_from_string("UTC"sv), TimeZone::TimeZone::UTC);
EXPECT(!TimeZone::time_zone_from_string("Europe/Paris"sv).has_value());
EXPECT(!TimeZone::time_zone_from_string("Etc/UTC"sv).has_value());
EXPECT(!TimeZone::time_zone_from_string("I don't exist"sv).has_value());
}
TEST_CASE(get_time_zone_offset)
{
EXPECT_EQ(TimeZone::get_time_zone_offset("UTC", AK::Time::from_seconds(123456)), 0);
EXPECT(!TimeZone::get_time_zone_offset("Europe/Paris"sv, {}).has_value());
EXPECT(!TimeZone::get_time_zone_offset("Etc/UTC"sv, {}).has_value());
EXPECT(!TimeZone::get_time_zone_offset("I don't exist"sv, {}).has_value());
}
#endif

View file

@ -8,8 +8,35 @@
namespace TimeZone {
Optional<TimeZone> __attribute__((weak)) time_zone_from_string(StringView) { return {}; }
StringView __attribute__((weak)) time_zone_to_string(TimeZone) { return {}; }
// NOTE: Without ENABLE_TIME_ZONE_DATA LibTimeZone operates in a UTC-only mode and only recognizes
// the 'UTC' time zone, which is slightly more useful than a bunch of dummy functions that
// can't do anything. When we build with time zone data, these weakly linked functions are
// replaced with their proper counterparts.
#if !ENABLE_TIME_ZONE_DATA
enum class TimeZone : u16 {
UTC,
};
#endif
Optional<TimeZone> __attribute__((weak)) time_zone_from_string([[maybe_unused]] StringView time_zone)
{
#if !ENABLE_TIME_ZONE_DATA
if (time_zone.equals_ignoring_case("UTC"sv))
return TimeZone::UTC;
#endif
return {};
}
StringView __attribute__((weak)) time_zone_to_string([[maybe_unused]] TimeZone time_zone)
{
#if !ENABLE_TIME_ZONE_DATA
VERIFY(time_zone == TimeZone::UTC);
return "UTC"sv;
#else
return {};
#endif
}
Optional<StringView> canonicalize_time_zone(StringView time_zone)
{
@ -24,7 +51,15 @@ Optional<StringView> canonicalize_time_zone(StringView time_zone)
return canonical_time_zone;
}
Optional<i64> __attribute__((weak)) get_time_zone_offset(TimeZone, AK::Time) { return {}; }
Optional<i64> __attribute__((weak)) get_time_zone_offset([[maybe_unused]] TimeZone time_zone, AK::Time)
{
#if !ENABLE_TIME_ZONE_DATA
VERIFY(time_zone == TimeZone::UTC);
return 0;
#else
return {};
#endif
}
Optional<i64> get_time_zone_offset(StringView time_zone, AK::Time time)
{