From 6d3e5ac6d2f34a0da609f863bed95d3be571c589 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 18 Jan 2018 13:48:26 +0100 Subject: Prefer ICU over system info on MS-Win The ICU data is more complete; and its APIs allow it to tell the whole story, which MS-Win's APIs can't (e.g. Morocco's otherwise-normal DST has a hole in it for Ramadan; when this makes four transitions in a year, the MS-APIs can't report more than two, so ignore the Ramadan gap); and their design obliges us to use heuristics to kludge round mis-description of simple changes to standard time in non-DST zones, which can't be distinguished from certain (more) obscure cases of changes to DST coinciding with a change to standard offset (causing a DST transition to hide, leaving its other end *looking like* a non-DST change to standard offset). Using ICU, when available, reduces how many end users shall be mislead by such kludges. [ChangeLog][Windows][QTimeZone] Changed MS-Win to use ICU for time-zone data, when available, in preference to MS's TZ APIs. The choice is made when building Qt. This will give reliable results when non-DST transitions arise, or when a zone's DST is not simple (e.g. interrupted by Ramadan). Task-number: QTBUG-42021 Change-Id: I9cdd65713ecdaf8cce52dd924fbc7371630977c8 Reviewed-by: Thiago Macieira --- src/corelib/tools/qtimezone.cpp | 10 ++++------ src/corelib/tools/qtimezoneprivate_win.cpp | 1 + src/corelib/tools/tools.pri | 14 ++++++++------ 3 files changed, 13 insertions(+), 12 deletions(-) (limited to 'src/corelib') diff --git a/src/corelib/tools/qtimezone.cpp b/src/corelib/tools/qtimezone.cpp index 6a514abbfe..a9a9b4f25e 100644 --- a/src/corelib/tools/qtimezone.cpp +++ b/src/corelib/tools/qtimezone.cpp @@ -66,11 +66,10 @@ static QTimeZonePrivate *newBackendTimeZone() return new QAndroidTimeZonePrivate(); #elif defined Q_OS_UNIX return new QTzTimeZonePrivate(); - // Registry based timezone backend not available on WinRT -#elif defined Q_OS_WIN - return new QWinTimeZonePrivate(); #elif QT_CONFIG(icu) return new QIcuTimeZonePrivate(); +#elif defined Q_OS_WIN + return new QWinTimeZonePrivate(); #else return new QUtcTimeZonePrivate(); #endif // System Locales @@ -93,11 +92,10 @@ static QTimeZonePrivate *newBackendTimeZone(const QByteArray &ianaId) return new QAndroidTimeZonePrivate(ianaId); #elif defined Q_OS_UNIX return new QTzTimeZonePrivate(ianaId); - // Registry based timezone backend not available on WinRT -#elif defined Q_OS_WIN - return new QWinTimeZonePrivate(ianaId); #elif QT_CONFIG(icu) return new QIcuTimeZonePrivate(ianaId); +#elif defined Q_OS_WIN + return new QWinTimeZonePrivate(ianaId); #else return new QUtcTimeZonePrivate(ianaId); #endif // System Locales diff --git a/src/corelib/tools/qtimezoneprivate_win.cpp b/src/corelib/tools/qtimezoneprivate_win.cpp index 8bde07c710..ec91b7e8a8 100644 --- a/src/corelib/tools/qtimezoneprivate_win.cpp +++ b/src/corelib/tools/qtimezoneprivate_win.cpp @@ -49,6 +49,7 @@ QT_BEGIN_NAMESPACE #ifndef Q_OS_WINRT +// The registry-based timezone backend is not available on WinRT, which falls back to equivalent APIs. #define QT_USE_REGISTRY_TIMEZONE 1 #endif diff --git a/src/corelib/tools/tools.pri b/src/corelib/tools/tools.pri index 56b30279bd..86afb46b8a 100644 --- a/src/corelib/tools/tools.pri +++ b/src/corelib/tools/tools.pri @@ -159,16 +159,18 @@ qtConfig(timezone) { SOURCES += \ tools/qtimezone.cpp \ tools/qtimezoneprivate.cpp - !nacl:darwin: \ + !nacl:darwin: { SOURCES += tools/qtimezoneprivate_mac.mm - else: android: \ + } else: android: { SOURCES += tools/qtimezoneprivate_android.cpp - else: unix: \ + } else: unix: { SOURCES += tools/qtimezoneprivate_tz.cpp - else: win32: \ - SOURCES += tools/qtimezoneprivate_win.cpp - qtConfig(icu): \ + qtConfig(icu): SOURCES += tools/qtimezoneprivate_icu.cpp + } else: qtConfig(icu): { SOURCES += tools/qtimezoneprivate_icu.cpp + } else: win32: { + SOURCES += tools/qtimezoneprivate_win.cpp + } } qtConfig(datetimeparser) { -- cgit v1.2.3