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