This patch is taken from the version of ICU in Google's Chromium. See: https://chromium.googlesource.com/chromium/deps/icu/+/10834e84d250eb31a73496bfdb7923eaa43ead51 diff --git a/intl/icu/source/common/putil.cpp b/intl/icu/source/common/putil.cpp --- a/intl/icu/source/common/putil.cpp +++ b/intl/icu/source/common/putil.cpp @@ -965,16 +965,25 @@ static char* searchForTZFile(const char* } } } } closedir(dirp); return result; } #endif + +U_CAPI void U_EXPORT2 +uprv_tzname_clear_cache() +{ +#if defined(CHECK_LOCALTIME_LINK) && !defined(DEBUG_SKIP_LOCALTIME_LINK) + gTimeZoneBufferPtr = NULL; +#endif +} + U_CAPI const char* U_EXPORT2 uprv_tzname(int n) { const char *tzid = NULL; #if U_PLATFORM_USES_ONLY_WIN32_API tzid = uprv_detectWindowsTimeZone(); if (tzid != NULL) { diff --git a/intl/icu/source/common/putilimp.h b/intl/icu/source/common/putilimp.h --- a/intl/icu/source/common/putilimp.h +++ b/intl/icu/source/common/putilimp.h @@ -478,16 +478,22 @@ U_INTERNAL int32_t U_EXPORT2 uprv_timez * tzname(1) Three-letter DST zone name derived from TZ environment * variable. E.g., "PDT". If DST zone is omitted from TZ, * tzname(1) is an empty string. * @internal */ U_INTERNAL const char* U_EXPORT2 uprv_tzname(int n); /** + * Reset the global tzname cache. + * @internal + */ +U_INTERNAL void uprv_tzname_clear_cache(); + +/** * Get UTC (GMT) time measured in milliseconds since 0:00 on 1/1/1970. * This function is affected by 'faketime' and should be the bottleneck for all user-visible ICU time functions. * @return the UTC time measured in milliseconds * @internal */ U_INTERNAL UDate U_EXPORT2 uprv_getUTCtime(void); /** diff --git a/intl/icu/source/i18n/timezone.cpp b/intl/icu/source/i18n/timezone.cpp --- a/intl/icu/source/i18n/timezone.cpp +++ b/intl/icu/source/i18n/timezone.cpp @@ -453,16 +453,18 @@ TimeZone::detectHostTimeZone() int32_t rawOffset = 0; const char *hostID; // First, try to create a system timezone, based // on the string ID in tzname[0]. uprv_tzset(); // Initialize tz... system data + uprv_tzname_clear_cache(); + // Get the timezone ID from the host. This function should do // any required host-specific remapping; e.g., on Windows this // function maps the Date and Time control panel setting to an // ICU timezone ID. hostID = uprv_tzname(0); // Invert sign because UNIX semantics are backwards rawOffset = uprv_timezone() * -U_MILLIS_PER_SECOND;