path: root/src/corelib/tools
diff options
authorEdward Welbourne <>2018-01-18 13:48:26 +0100
committerEdward Welbourne <>2018-02-07 12:21:00 +0000
commit6d3e5ac6d2f34a0da609f863bed95d3be571c589 (patch)
treef372cab569443cf05514cc4a6092cb0b6400e958 /src/corelib/tools
parentaec6fae60b4e229b7e00e534c47d341caf49cddc (diff)
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 <>
Diffstat (limited to 'src/corelib/tools')
3 files changed, 13 insertions, 12 deletions
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();
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);
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 @@
#ifndef Q_OS_WINRT
+// The registry-based timezone backend is not available on WinRT, which falls back to equivalent APIs.
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) {
tools/qtimezone.cpp \
- !nacl:darwin: \
+ !nacl:darwin: {
SOURCES += tools/
- 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) {