diff --git a/Tests/LibTimeZone/TestTimeZone.cpp b/Tests/LibTimeZone/TestTimeZone.cpp index 01f805872f..946ea5b0d0 100644 --- a/Tests/LibTimeZone/TestTimeZone.cpp +++ b/Tests/LibTimeZone/TestTimeZone.cpp @@ -69,4 +69,19 @@ TEST_CASE(time_zone_to_string_link) EXPECT_EQ(TimeZone::time_zone_to_string(TimeZone::TimeZone::Etc_Universal), "Etc/UTC"sv); } +TEST_CASE(canonicalize_time_zone) +{ + EXPECT_EQ(TimeZone::canonicalize_time_zone("America/New_York"sv), "America/New_York"sv); + EXPECT_EQ(TimeZone::canonicalize_time_zone("AmErIcA/NeW_YoRk"sv), "America/New_York"sv); + + EXPECT_EQ(TimeZone::canonicalize_time_zone("UTC"sv), "UTC"sv); + EXPECT_EQ(TimeZone::canonicalize_time_zone("GMT"sv), "UTC"sv); + EXPECT_EQ(TimeZone::canonicalize_time_zone("GMT+0"sv), "UTC"sv); + EXPECT_EQ(TimeZone::canonicalize_time_zone("GMT-0"sv), "UTC"sv); + EXPECT_EQ(TimeZone::canonicalize_time_zone("Etc/UTC"sv), "UTC"sv); + EXPECT_EQ(TimeZone::canonicalize_time_zone("Etc/GMT"sv), "UTC"sv); + + EXPECT(!TimeZone::canonicalize_time_zone("I don't exist"sv).has_value()); +} + #endif diff --git a/Userland/Libraries/LibTimeZone/TimeZone.cpp b/Userland/Libraries/LibTimeZone/TimeZone.cpp index fc1fc6065d..767bdc3c3f 100644 --- a/Userland/Libraries/LibTimeZone/TimeZone.cpp +++ b/Userland/Libraries/LibTimeZone/TimeZone.cpp @@ -11,4 +11,17 @@ namespace TimeZone { Optional __attribute__((weak)) time_zone_from_string(StringView) { return {}; } StringView __attribute__((weak)) time_zone_to_string(TimeZone) { return {}; } +Optional canonicalize_time_zone(StringView time_zone) +{ + auto maybe_time_zone = time_zone_from_string(time_zone); + if (!maybe_time_zone.has_value()) + return {}; + + auto canonical_time_zone = time_zone_to_string(*maybe_time_zone); + if (canonical_time_zone.is_one_of("Etc/UTC"sv, "Etc/GMT"sv)) + return "UTC"sv; + + return canonical_time_zone; +} + } diff --git a/Userland/Libraries/LibTimeZone/TimeZone.h b/Userland/Libraries/LibTimeZone/TimeZone.h index 63cc1e49a9..c280618846 100644 --- a/Userland/Libraries/LibTimeZone/TimeZone.h +++ b/Userland/Libraries/LibTimeZone/TimeZone.h @@ -14,5 +14,6 @@ namespace TimeZone { Optional time_zone_from_string(StringView time_zone); StringView time_zone_to_string(TimeZone time_zone); +Optional canonicalize_time_zone(StringView time_zone); }