conversion/timezoneconverter.cpp

Christian Mollekopf mollekopf at kolabsys.com
Thu Dec 20 02:53:45 CET 2012


 conversion/timezoneconverter.cpp |   90 +++++++++++++++++++++++++++++----------
 1 file changed, 67 insertions(+), 23 deletions(-)

New commits:
commit 799219cc7e45073dc86e2d97475e483c70f2b030
Author: Christian Mollekopf <mollekopf at kolabsys.com>
Date:   Thu Dec 20 02:53:29 2012 +0100

    Beginning of a more thorough windows timezone conversion table.

diff --git a/conversion/timezoneconverter.cpp b/conversion/timezoneconverter.cpp
index 6941681..57c9b70 100644
--- a/conversion/timezoneconverter.cpp
+++ b/conversion/timezoneconverter.cpp
@@ -74,32 +74,76 @@ QString TimezoneConverter::fromCityName(const QString& tz)
     return QString();
 }
 
+
+//Based on
+// * http://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx
+// * http://technet.microsoft.com/en-us/library/cc749073(v=ws.10).aspx
+// * http://unicode.org/repos/cldr/trunk/common/supplemental/windowsZones.xml
+// * http://stackoverflow.com/questions/4967903/linux-windows-timezone-mapping
+static const struct WindowsTimezone {
+//   const int gmtOffset;
+  const char *timezoneSpecifier; //This one should be stable and always in english
+  const char *name; //The display name (which is in some cases still useful to try guessing)
+  const char *olson[2]; //Corresponding olson timezones we can map to
+} windowsTimezones[] = {
+    {"Afghanistan Standard Time", "Kabul", {"Asia/Kabul"}},
+    {"Alaskan Standard Time", "Alaska", {"America/Anchorage"}},
+    {"Arab Standard Time", "Kuwait, Riyadh", {"Asia/Riyadh"}},
+    {"Arabian Standard Time", "Abu Dhabi, Muscat", {"Asia/Dubai"}},
+    {"Arabic Standard Time", "Baghdad", {"Asia/Baghdad"}},
+    {"Atlantic Standard Time", "Atlantic Time (Canada)", {"America/Halifax"}},
+    {"AUS Central Standard Time", "Darwin", {"Australia/Darwin"}},
+    {"AUS Eastern Standard Time", "Canberra, Melbourne, Sydney", {"Australia/Sydney"}},
+    {"Azerbaijan Standard Time", "Baku", {"Asia/Baku"}},
+    {"Azores Standard Time", "Azores", {"Atlantic/Azores"}},
+    {"Canada Central Standard Time", "Saskatchewan", {"America/Regina"}},
+    {"Cape Verde Standard Time", "Cape Verde Islands", {"Atlantic/Cape_Verde"}},
+    {"Caucasus Standard Time", "Yerevan", {"Asia/Yerevan"}},
+    {"Cen. Australia Standard Time", "Adelaide", {"Australia/Adelaide"}},
+    {"Central America Standard Time", "Central America", {"America/Guatemala"}},
+    {"Central Asia Standard Time", "Astana, Dhaka", {"Asia/Almaty"}},
+    {"Central Brazilian Standard Time", "Manaus", {"America/Manaus"}},
+    {"Central Europe Standard Time", "Belgrade, Bratislava, Budapest, Ljubljana, Prague", {"Europe/Budapest"}},
+    {"Central European Standard Time", "Sarajevo, Skopje, Warsaw, Zagreb", {"Europe/Warsaw"}},
+    {"Central Pacific Standard Time", "Magadan, Solomon Islands, New Caledonia", {"Asia/Magadan"}},
+    {"Central Standard Time", "Central Time", {"America/Chicago"}},
+    {"Central Standard Time (Mexico)", "Guadalajara, Mexico City, Monterrey", {"America/Mexico_City"}},
+    {"China Standard Time", "Beijing, Chongqing, Hong Kong SAR, Urumqi", {"Asia/Shanghai"}},
+//     {"Dateline Standard Time", "International Date Line West", {""}},
+    {"E. Africa Standard Time", "Nairobi", {"Africa/Nairobi"}},
+    {"E. Australia Standard Time", "Brisbane", {"Australia/Brisbane"}},
+    {"E. Europe Standard Time", "Minsk", {"Europe/Minsk"}},
+    {"E. South America Standard Time", "Brasilia", {"America/Sao_Paulo"}},
+    {"Eastern Standard Time", "Eastern Time", {"America/New_York"}},
+    {"Egypt Standard Time", "Cairo", {"Africa/Cairo"}},
+    {"Ekaterinburg Standard Time", "Ekaterinburg", {"Asia/Yekaterinburg"}},
+    {"Fiji Standard Time", "Fiji Islands, Kamchatka, Marshall Islands", {"Pacific/Fiji"}},
+    {"FLE Standard Time", "Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius", {"Europe/Kiev"}},
+    {"Georgian Standard Time", "Tblisi", {"Asia/Tbilisi"}},
+    {"GMT Standard Time", "Greenwich Mean Time : Dublin, Edinburgh, Lisbon, London", {"Europe/London"}},
+    {"Greenland Standard Time", "Greenland", {"America/Godthab"}},
+    {"Greenwich Standard Time", "Casablanca, Monrovia", {"Atlantic/Reykjavik"}},
+    {"", "", {""}},
+    
+    {"W. Europe Standard Time", "Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna", {"Europe/Berlin", "Europe/Amsterdam"}},
+    {"W. Central Africa Standard Time", "West Central Africa", {"Africa/Lagos"}}
+};
+static const int numWindowsTimezones = sizeof windowsTimezones / sizeof *windowsTimezones;
+
 QString TimezoneConverter::fromHardcodedList(const QString& tz)
 {
-    if (tz.contains(QLatin1String("West Central Africa"))) {
-        return QLatin1String("Africa/Lagos");
-    }
-    if (tz.contains(QLatin1String("Atlantic Time"))) {
-        return QLatin1String("America/Halifax");
-    }
-    if (tz.contains(QLatin1String("Saskatchewan"))) {
-        return QLatin1String("America/Regina");
-    }
-    if (tz.contains(QLatin1String("Cape Verde Islands"))) {
-        return QLatin1String("Atlantic/Cape_Verde");
-    }
-    if (tz.contains(QLatin1String("Central America"))) {
-        return QLatin1String("America/Guatemala");
-    }
-    if (tz.contains(QLatin1String("Central Time"))) {
-        return QLatin1String("America/Chicago");
-    }
-//     if (tz.contains(QLatin1String("International Date Line West"))) {
-//         return QLatin1String("");
-//     }
-    if (tz.contains(QLatin1String("Eastern Time"))) {
-        return QLatin1String("America/New_York");
+    for (int i = 0; i <numWindowsTimezones; i++) {
+        const WindowsTimezone &windowsTimezone = windowsTimezones[i];
+        const QByteArray specifier(windowsTimezone.timezoneSpecifier);
+        const QByteArray windowsName(windowsTimezone.name);
+        if ((!specifier.isEmpty() && tz.contains(specifier)) ||
+            (!windowsName.isEmpty() && tz.contains(windowsName))) {
+            //TODO find the olson timezone matching the local timezone if we have multiple to map to
+            return QString::fromLatin1(windowsTimezone.olson[0]);
+        }
     }
+    
+
 //     if (tz.contains(QLatin1String("Mid-Atlantic"))) {
 //         return QLatin1String();
 //     }





More information about the commits mailing list