diff --git a/Tests/LibTimeZone/TestTimeZone.cpp b/Tests/LibTimeZone/TestTimeZone.cpp index d93fbd5c1e..50efd28a25 100644 --- a/Tests/LibTimeZone/TestTimeZone.cpp +++ b/Tests/LibTimeZone/TestTimeZone.cpp @@ -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 diff --git a/Userland/Libraries/LibTimeZone/TimeZone.cpp b/Userland/Libraries/LibTimeZone/TimeZone.cpp index d74fe6e034..b87f11fc3a 100644 --- a/Userland/Libraries/LibTimeZone/TimeZone.cpp +++ b/Userland/Libraries/LibTimeZone/TimeZone.cpp @@ -8,8 +8,35 @@ namespace TimeZone { -Optional __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 __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 canonicalize_time_zone(StringView time_zone) { @@ -24,7 +51,15 @@ Optional canonicalize_time_zone(StringView time_zone) return canonical_time_zone; } -Optional __attribute__((weak)) get_time_zone_offset(TimeZone, AK::Time) { return {}; } +Optional __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 get_time_zone_offset(StringView time_zone, AK::Time time) {