- MF51: Implemented better timezone guessing algorithm.
authorDerick Rethans <derick@php.net>
Sat, 1 Oct 2005 15:07:20 +0000 (15:07 +0000)
committerDerick Rethans <derick@php.net>
Sat, 1 Oct 2005 15:07:20 +0000 (15:07 +0000)
ext/date/lib/fallbackmap.h [new file with mode: 0644]
ext/date/lib/parse_date.c
ext/date/lib/parse_date.re
ext/date/lib/resource/parse_date.re
ext/date/lib/timelib.h
ext/date/lib/timelib_structs.h
ext/date/lib/timezonemap.h [new file with mode: 0644]
ext/date/php_date.c
ext/date/tests/date_default_timezone_get-1.phpt
ext/date/tests/date_default_timezone_set-1.phpt

diff --git a/ext/date/lib/fallbackmap.h b/ext/date/lib/fallbackmap.h
new file mode 100644 (file)
index 0000000..b6c3760
--- /dev/null
@@ -0,0 +1,34 @@
+       { "hst",   0,  -10,  "Pacific/Honolulu" },
+       { "akst",  0,   -9,  "America/Anchorage" },
+       { "akdt",  1,   -8,  "America/Anchorage" },
+       { "pst",   0,   -8,  "America/Los_Angeles" },
+       { "pdt",   1,   -7,  "America/Los_Angeles" },
+       { "mst",   0,   -7,  "America/Denver" },
+       { "mdt",   1,   -6,  "America/Denver" },
+       { "cst",   0,   -6,  "America/Chicago" },
+       { "cdt",   1,   -5,  "America/Chicago" },
+       { "est",   0,   -5,  "America/New_York" },
+       { "edt",   1,   -4,  "America/New_York" },
+       { "ast",   0,   -4,  "America/Halifax" },
+       { "adt",   0,   -3,  "America/Halifax" },
+       { "gmt",   0,    0,  "Europe/London" },
+       { "bst",   1,    1,  "Europe/London" },
+       { "cet",   0,    1,  "Europe/Paris" },
+       { "cest",  1,    2,  "Europe/Paris" },
+       { "eet",   0,    2,  "Europe/Helsinki" },
+       { "eest",  1,    3,  "Europe/Helsinki" },
+       { "msk",   0,    3,  "Europe/Moscow" },
+       { "msd",   1,    4,  "Europe/Moscow" },
+       { "gst",   0,    4,  "Asia/Dubai" },
+       { "pkt",   0,    5,  "Asia/Karachi" },
+       { "ist",   0,  5.5,  "Asia/Calcutta" },
+       { "npt",   0, 5.75,  "Asia/Katmandu" },
+       { "novst", 1,    7,  "Asia/Novosibirsk" },
+       { "krat",  0,    7,  "Asia/Krasnoyarsk" },
+       { "krast", 1,    8,  "Asia/Krasnoyarsk" },
+       { "jst",   0,    9,  "Asia/Tokyo" },
+       { "est",   0,   10,  "Australia/Melbourne" },
+       { "cst",   1, 10.5,  "Australia/Adelaide" },
+       { "est",   1,   11,  "Australia/Melbourne" },
+       { "nzst",  0,   12,  "Pacific/Auckland" },
+       { "nzdt",  1,   13,  "Pacific/Auckland" },
index 8fcaa86ba1d2080df7f7a0f2f988c53b2beff25f..86271f2568e33ca01ef786ff9c7d50d3465e1b28 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.9.10.dev on Thu Aug 25 11:40:22 2005 */
+/* Generated by re2c 0.9.10.dev on Sat Oct  1 17:04:46 2005 */
 #line 1 "resource/parse_date.re"
 /*
    +----------------------------------------------------------------------+
@@ -162,108 +162,13 @@ typedef struct _timelib_relunit {
 
 /* The timezone table. */
 static timelib_tz_lookup_table timelib_timezone_lookup[] = {
-       { "a",    0,    HOUR (- 1), NULL                  },
-       { "adt",  1,    HOUR (  4), "America/Halifax"     }, /* Atlantic Daylight */
-       { "ahst", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska-Hawaii Standard */
-       { "akdt", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska Daylight */
-       { "akst", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska Standard */
-       { "ast",  0,    HOUR (  4), "America/Halifax"     }, /* Atlantic Standard */
-       { "at",   0,    HOUR (  2), "Atlantic/Azores"     }, /* Azores */
-       { "b",    0,    HOUR (- 2), NULL                  },
-       { "bst",  1,    HOUR (  0), "Europe/London"       }, /* British Summer */
-       { "bt",   0,   -HOUR (  3), "Asia/Baghdad"        }, /* Baghdad, USSR Zone 2 */
-       { "c",    0,    HOUR (- 3), NULL                  },
-       { "cadt", 1,   -HOUR (9.5), "Australia/Adelaide"  }, /* Central Australian Daylight */
-       { "cast", 0,   -HOUR (9.5), "Australia/Adelaide"  }, /* Central Australian Standard */
-       { "cat",  0,    HOUR ( 10), "America/Anchorage"   }, /* Central Alaska */
-       { "cct",  0,   -HOUR (  8), "Asia/Shanghai"       }, /* China Coast, USSR Zone 7 */
-       { "cdt",  1,    HOUR (  6), "America/Chicago"     }, /* Central Daylight */
-       { "cest", 1,   -HOUR (  1), "Europe/Berlin"       }, /* Central European Summer */
-       { "cet",  0,   -HOUR (  1), "Europe/Berlin"       }, /* Central European */
-       { "cst",  0,    HOUR (  6), "America/Chicago"     }, /* Central Standard */
-       { "d",    0,    HOUR (- 4), NULL                  },
-       { "e",    0,    HOUR (- 5), NULL                  },
-       { "eadt", 1,   -HOUR ( 10), "Australia/Sydney"    }, /* Eastern Australian Daylight */
-       { "east", 0,   -HOUR ( 10), "Australia/Sydney"    }, /* Eastern Australian Standard */
-       { "edt",  1,    HOUR (  5), "America/New_York"    }, /* Eastern Daylight */
-       { "eest", 1,    HOUR (  2), "Europe/Helsinki"     }, /* Eastern European Summer */
-       { "eet",  0,   -HOUR (  2), "Europe/Bucharest"    }, /* Eastern Europe, USSR Zone 1 */
-       { "est",  0,    HOUR (  5), "America/New_York"    }, /* Eastern Standard */
-       { "f",    0,    HOUR (- 6), NULL                  },
-       { "fst",  1,   -HOUR (  1), "Europe/Paris"        }, /* French Summer */
-       { "fwt",  0,   -HOUR (  1), "Europe/Paris"        }, /* French Winter */
-       { "g",    0,    HOUR (- 7), NULL                  },
-       { "gmt",  0,    HOUR (  0), "GMT"                 }, /* Greenwich Mean */
-       { "gst",  0,   -HOUR ( 10), "Pacific/Guam"        }, /* Guam Standard, USSR Zone 9 */
-       { "h",    0,    HOUR (- 8), NULL                  },
-       { "hdt",  1,    HOUR ( 10), "Pacific/Honolulu"    }, /* Hawaii Daylight */
-       { "hst",  0,    HOUR ( 10), "Pacific/Honolulu"    }, /* Hawaii Standard */
-       { "i",    0,    HOUR (- 9), NULL                  },
-       { "idle", 0,   -HOUR ( 12), "NZ"                  }, /* International Date Line East */
-       { "idlw", 0,    HOUR ( 12), NULL                  }, /* International Date Line West */
-       { "ist",  0,   -HOUR (5.5), "Asia/Calcutta"       }, /* Indian Standard */
-       { "it",   0,   -HOUR (3.5), "Asia/Tehran"         }, /* Iran */
-       { "jst",  0,   -HOUR (  9), "Asia/Tokyo"          }, /* Japan Standard, USSR Zone 8 */
-       { "jt",   0,   -HOUR (7.5), NULL                  }, /* Java (3pm in Cronusland!) */
-       { "k",    0,    HOUR (-10), NULL                  },
-       { "l",    0,    HOUR (-11), NULL                  },
-       { "m",    0,    HOUR (-12), NULL                  },
-       { "mdt",  1,    HOUR (  7), "America/Phoenix"     }, /* Mountain Daylight */
-       { "mest", 1,   -HOUR (  1), "MET"                 }, /* Middle European Summer */
-       { "mesz", 1,   -HOUR (  1), "MET"                 }, /* Middle European Summer */
-       { "met",  0,   -HOUR (  1), "MET"                 }, /* Middle European */
-       { "mewt", 0,   -HOUR (  1), "MET"                 }, /* Middle European Winter */
-       { "msd",  1,    HOUR (  3), "Europe/Moscow"       }, /* Moscow Summer */
-       { "msk",  0,    HOUR (  3), "Europe/Moscow"       }, /* Moscow */
-       { "mst",  0,    HOUR (  7), "America/Phoenix"     }, /* Mountain Standard */
-       { "n",    0,    HOUR (  1), NULL                  },
-       { "ndt",  1,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland Daylight */
-       { "nft",  0,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland */
-       { "nst",  0,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland Standard */
-       { "nt",   0,    HOUR ( 11), NULL                  }, /* Nome */
-       { "nzdt", 1,   -HOUR ( 12), "NZ"                  }, /* New Zealand Daylight */
-       { "nzst", 0,   -HOUR ( 12), "NZ"                  }, /* New Zealand Standard */
-       { "nzt",  0,   -HOUR ( 12), "NZ"                  }, /* New Zealand */
-       { "o",    0,    HOUR (  2), NULL                  },
-       { "p",    0,    HOUR (  3), NULL                  },
-       { "pdt",  1,    HOUR (  8), "America/Los_Angeles" }, /* Pacific Daylight */
-       { "pst",  0,    HOUR (  8), "America/Los_Angeles" }, /* Pacific Standard */
-       { "q",    0,    HOUR (  4), NULL                  },
-       { "r",    0,    HOUR (  5), NULL                  },
-       { "s",    0,    HOUR (  6), NULL                  },
-       { "slst", 1,   -HOUR (  1), "Europe/Oslo"         }, /* Skien Local Summer Time */
-       { "slt",  0,   -HOUR (  1), "Europe/Oslo"         }, /* Skien Local Time */
-       { "sst",  1,   -HOUR (  1), "Europe/Stockholm"    }, /* Swedish Summer */
-       { "swt",  0,   -HOUR (  1), "Europe/Stockholm"    }, /* Swedish Winter */
-       { "t",    0,    HOUR (  7), NULL                  },
-       { "u",    0,    HOUR (  8), NULL                  },
-       { "ut",   0,    HOUR (  0), "UTC"                 }, /* Universal (Coordinated) */
-       { "utc",  0,    HOUR (  0), "UTC"                 },
-       { "v",    0,    HOUR (  9), NULL                  },
-       { "w",    0,    HOUR ( 10), NULL                  },
-       { "wadt", 1,   -HOUR (  7), "Australia/Perth"     }, /* West Australian Daylight */
-       { "wast", 0,   -HOUR (  7), "Australia/Perth"     }, /* West Australian Standard */
-       { "wat",  0,    HOUR (  1), "Africa/Dakar"        }, /* West Africa */
-       { "wet",  0,    HOUR (  0), "Europe/London"       }, /* Western European */
-       { "x",    0,    HOUR ( 11), NULL                  },
-       { "y",    0,    HOUR ( 12), NULL                  },
-       { "ydt",  1,    HOUR (  9), "America/Anchorage"   }, /* Yukon Daylight */
-       { "yst",  0,    HOUR (  9), "America/Anchorage"   }, /* Yukon Standard */
-       { "z",    0,    HOUR (  0), NULL                  },
-       { "zp4",  0,   -HOUR (  4), NULL                  }, /* USSR Zone 3 */
-       { "zp5",  0,   -HOUR (  5), NULL                  }, /* USSR Zone 4 */
-       { "zp6",  0,   -HOUR (  6), NULL                  }, /* USSR Zone 5 */
-#if 0
-       /* For completeness.  BST is also British Summer, and GST is
-        * also Guam Standard. */
-       { "bst",  0,   HOUR ( 3), NULL },  /* Brazil Standard */
-       { "gst",  0,   HOUR ( 3), NULL },  /* Greenland Standard */
+#include "timezonemap.h"
+       { NULL, 0, 0, NULL },
+};
 
-       /* For completeness.  NST is also Newfoundland Standard, and SST is
-        * also Swedish Summer. */
-       { "nst",  0,   -HOUR (6.5), NULL },/* North Sumatra */
-       { "sst",  0,   -HOUR (7), NULL },  /* South Sumatra, USSR Zone 6 */
-#endif
+static timelib_tz_lookup_table timelib_timezone_fallbackmap[] = {
+#include "fallbackmap.h"
+       { NULL, 0, 0, NULL },
 };
 
 static timelib_relunit const timelib_relunit_lookup[] = {
@@ -652,24 +557,37 @@ static void timelib_set_relative(char **ptr, timelib_sll amount, Scanner *s)
        }
 }
 
-static timelib_tz_lookup_table* zone_search(const char *word, int left, int right)
+static timelib_tz_lookup_table* zone_search(const char *word, long gmtoffset, int isdst)
 {
-       int mid, cmp;
-
-       if (left > right) {
-               return NULL; /* not found */
-       }
-       mid = (left + right) / 2;
-       cmp = strcasecmp(word, timelib_timezone_lookup[mid].name);
-       if (cmp < 0) {
-               return zone_search(word, left, mid - 1);
-       } else if (cmp > 0) {
-               return zone_search(word, mid + 1, right);
-       } else { /* (cmp == 0) */
-               return (timelib_tz_lookup_table*)&timelib_timezone_lookup[mid];
+       int first_found = 0;
+       timelib_tz_lookup_table  *tp, *first_found_elem;
+       timelib_tz_lookup_table  *fmp;
+       
+       for (tp = timelib_timezone_lookup; tp->name; tp++) {
+               if (strcasecmp(word, tp->name) == 0) {
+                       if (!first_found) {
+                               first_found = 1;
+                               first_found_elem = tp;
+                               if (gmtoffset == -1) {
+                                       return tp;
+                               }
+                       }
+                       if (tp->gmtoffset == gmtoffset) {
+                               return tp;
+                       }
+               }
+       }
+       if (first_found) {
+               return first_found_elem;
+       }
+       /* Still didn't find anything, let's find the zone solely based on
+        * offset/isdst then */
+       for (fmp = timelib_timezone_fallbackmap; fmp->name; fmp++) {
+               if ((fmp->gmtoffset * 3600) == gmtoffset && fmp->type == isdst) {
+                       return fmp;
+               }
        }
+       return NULL;
 }
 
 static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found)
@@ -686,9 +604,10 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found
        word = calloc(1, end - begin + 1);
        memcpy(word, begin, end - begin);
 
-       if ((tp = zone_search(word, 0, sizeof(timelib_timezone_lookup)/sizeof(*timelib_timezone_lookup)-1))) {
-               value = tp->value;
+       if ((tp = zone_search(word, -1, 0))) {
+               value = -tp->gmtoffset / 60;
                *dst = tp->type;
+               value += tp->type * 60;
                *found = 1;
        } else {
                *found = 0;
@@ -773,7 +692,7 @@ static int scan(Scanner *s)
 std:
        s->tok = cursor;
        s->len = 0;
-#line 879 "resource/parse_date.re"
+#line 798 "resource/parse_date.re"
 
 
 {
@@ -812,7 +731,7 @@ std:
          0,   0,   0,   0,   0,   0,   0,   0, 
        };
 
-#line 816 "<stdout>"
+#line 735 "<stdout>"
 {
        YYCTYPE yych;
        unsigned int yyaccept;
@@ -897,7 +816,7 @@ yy2:
 yy3:
        YYDEBUG(3, *YYCURSOR);
 
-#line 1361 "resource/parse_date.re"
+#line 1280 "resource/parse_date.re"
 {
                int tz_not_found;
                DEBUG_OUTPUT("tzcorrection | tz");
@@ -907,7 +826,7 @@ yy3:
                TIMELIB_DEINIT;
                return TIMELIB_TIMEZONE;
        }
-#line 904 "<stdout>"
+#line 823 "<stdout>"
 yy4:
        YYDEBUG(4, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -993,13 +912,13 @@ yy6:
 yy7:
        YYDEBUG(7, *YYCURSOR);
 
-#line 1427 "resource/parse_date.re"
+#line 1346 "resource/parse_date.re"
 {
 /*             printf("unexpected character: #%d, %c ", *s->tok, *s->tok); */
                s->errors++;
                goto std;
        }
-#line 987 "<stdout>"
+#line 906 "<stdout>"
 yy8:
        YYDEBUG(8, *YYCURSOR);
        yyaccept = 0;
@@ -1922,11 +1841,11 @@ yy43:
 yy44:
        YYDEBUG(44, *YYCURSOR);
 
-#line 1416 "resource/parse_date.re"
+#line 1335 "resource/parse_date.re"
 {
                goto std;
        }
-#line 1835 "<stdout>"
+#line 1754 "<stdout>"
 yy45:
        YYDEBUG(45, *YYCURSOR);
        ++YYCURSOR;
@@ -1934,12 +1853,12 @@ yy45:
 yy46:
        YYDEBUG(46, *YYCURSOR);
 
-#line 1421 "resource/parse_date.re"
+#line 1340 "resource/parse_date.re"
 {
                s->pos = cursor; s->line++;
                goto std;
        }
-#line 1844 "<stdout>"
+#line 1763 "<stdout>"
 yy47:
        YYDEBUG(47, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -2397,7 +2316,7 @@ yy84:
 yy85:
        YYDEBUG(85, *YYCURSOR);
 
-#line 1400 "resource/parse_date.re"
+#line 1319 "resource/parse_date.re"
 {
                timelib_ull i;
                DEBUG_OUTPUT("relative");
@@ -2412,7 +2331,7 @@ yy85:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 2234 "<stdout>"
+#line 2153 "<stdout>"
 yy86:
        YYDEBUG(86, *YYCURSOR);
        ++YYCURSOR;
@@ -3105,12 +3024,12 @@ yy150:
 yy151:
        YYDEBUG(151, *YYCURSOR);
 
-#line 1355 "resource/parse_date.re"
+#line 1274 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("dayabbr");
                goto std;
        }
-#line 2798 "<stdout>"
+#line 2717 "<stdout>"
 yy152:
        YYDEBUG(152, *YYCURSOR);
        yyaccept = 1;
@@ -3149,7 +3068,7 @@ yy157:
 yy158:
        YYDEBUG(158, *YYCURSOR);
 
-#line 1339 "resource/parse_date.re"
+#line 1258 "resource/parse_date.re"
 {
                const timelib_relunit* relunit;
                DEBUG_OUTPUT("dayfull");
@@ -3164,7 +3083,7 @@ yy158:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 2838 "<stdout>"
+#line 2757 "<stdout>"
 yy159:
        YYDEBUG(159, *YYCURSOR);
        yyaccept = 1;
@@ -3533,7 +3452,7 @@ yy189:
 yy190:
        YYDEBUG(190, *YYCURSOR);
 
-#line 1323 "resource/parse_date.re"
+#line 1242 "resource/parse_date.re"
 {
                timelib_sll i;
                DEBUG_OUTPUT("relativetext");
@@ -3548,7 +3467,7 @@ yy190:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 3156 "<stdout>"
+#line 3075 "<stdout>"
 yy191:
        YYDEBUG(191, *YYCURSOR);
        ++YYCURSOR;
@@ -9178,7 +9097,7 @@ yy508:
 yy509:
        YYDEBUG(509, *YYCURSOR);
 
-#line 1145 "resource/parse_date.re"
+#line 1064 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("datetextual | datenoyear");
                TIMELIB_INIT;
@@ -9190,7 +9109,7 @@ yy509:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_TEXT;
        }
-#line 8149 "<stdout>"
+#line 8068 "<stdout>"
 yy510:
        YYDEBUG(510, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -9350,7 +9269,7 @@ yy526:
 yy527:
        YYDEBUG(527, *YYCURSOR);
 
-#line 1372 "resource/parse_date.re"
+#line 1291 "resource/parse_date.re"
 {
                int tz_not_found;
                DEBUG_OUTPUT("dateshortwithtimeshort | dateshortwithtimelong | dateshortwithtimelongtz");
@@ -9377,7 +9296,7 @@ yy527:
                TIMELIB_DEINIT;
                return TIMELIB_SHORTDATE_WITH_TIME;
        }
-#line 8300 "<stdout>"
+#line 8219 "<stdout>"
 yy528:
        YYDEBUG(528, *YYCURSOR);
        yyaccept = 7;
@@ -9690,7 +9609,7 @@ yy561:
 yy562:
        YYDEBUG(562, *YYCURSOR);
 
-#line 1119 "resource/parse_date.re"
+#line 1038 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("datenoday");
                TIMELIB_INIT;
@@ -9702,7 +9621,7 @@ yy562:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_NO_DAY;
        }
-#line 8555 "<stdout>"
+#line 8474 "<stdout>"
 yy563:
        YYDEBUG(563, *YYCURSOR);
        yyaccept = 6;
@@ -10002,7 +9921,7 @@ yy587:
 yy588:
        YYDEBUG(588, *YYCURSOR);
 
-#line 1254 "resource/parse_date.re"
+#line 1173 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("pgtextshort");
                TIMELIB_INIT;
@@ -10014,7 +9933,7 @@ yy588:
                TIMELIB_DEINIT;
                return TIMELIB_PG_TEXT;
        }
-#line 8814 "<stdout>"
+#line 8733 "<stdout>"
 yy589:
        YYDEBUG(589, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -11518,7 +11437,7 @@ yy683:
 yy684:
        YYDEBUG(684, *YYCURSOR);
 
-#line 1308 "resource/parse_date.re"
+#line 1227 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("ago");
                TIMELIB_INIT;
@@ -11532,7 +11451,7 @@ yy684:
                TIMELIB_DEINIT;
                return TIMELIB_AGO;
        }
-#line 10139 "<stdout>"
+#line 10058 "<stdout>"
 yy685:
        YYDEBUG(685, *YYCURSOR);
        yyaccept = 1;
@@ -13466,7 +13385,7 @@ yy787:
 yy788:
        YYDEBUG(788, *YYCURSOR);
 
-#line 1158 "resource/parse_date.re"
+#line 1077 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("datenoyearrev");
                TIMELIB_INIT;
@@ -13476,7 +13395,7 @@ yy788:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_TEXT;
        }
-#line 11871 "<stdout>"
+#line 11790 "<stdout>"
 yy789:
        YYDEBUG(789, *YYCURSOR);
        yyaccept = 10;
@@ -13569,7 +13488,7 @@ yy796:
 yy797:
        YYDEBUG(797, *YYCURSOR);
 
-#line 966 "resource/parse_date.re"
+#line 885 "resource/parse_date.re"
 {
                int tz_not_found;
                DEBUG_OUTPUT("timeshort24 | timelong24 | iso8601long");
@@ -13592,7 +13511,7 @@ yy797:
                TIMELIB_DEINIT;
                return TIMELIB_TIME24_WITH_ZONE;
        }
-#line 11969 "<stdout>"
+#line 11888 "<stdout>"
 yy798:
        YYDEBUG(798, *YYCURSOR);
        yyaccept = 11;
@@ -13720,7 +13639,7 @@ yy811:
 yy812:
        YYDEBUG(812, *YYCURSOR);
 
-#line 951 "resource/parse_date.re"
+#line 870 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("timeshort12 | timelong12");
                TIMELIB_INIT;
@@ -13734,7 +13653,7 @@ yy812:
                TIMELIB_DEINIT;
                return TIMELIB_TIME12;
        }
-#line 12081 "<stdout>"
+#line 12000 "<stdout>"
 yy813:
        YYDEBUG(813, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -13857,7 +13776,7 @@ yy824:
 yy825:
        YYDEBUG(825, *YYCURSOR);
 
-#line 1093 "resource/parse_date.re"
+#line 1012 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("datefull");
                TIMELIB_INIT;
@@ -13869,7 +13788,7 @@ yy825:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_FULL;
        }
-#line 12190 "<stdout>"
+#line 12109 "<stdout>"
 yy826:
        YYDEBUG(826, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -14488,7 +14407,7 @@ yy892:
 yy893:
        YYDEBUG(893, *YYCURSOR);
 
-#line 1106 "resource/parse_date.re"
+#line 1025 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("pointed date");
                TIMELIB_INIT;
@@ -14500,7 +14419,7 @@ yy893:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_FULL_POINTED;
        }
-#line 12685 "<stdout>"
+#line 12604 "<stdout>"
 yy894:
        YYDEBUG(894, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -15068,7 +14987,7 @@ yy938:
 yy939:
        YYDEBUG(939, *YYCURSOR);
 
-#line 1080 "resource/parse_date.re"
+#line 999 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("gnudateshort");
                TIMELIB_INIT;
@@ -15080,7 +14999,7 @@ yy939:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_DATE;
        }
-#line 13173 "<stdout>"
+#line 13092 "<stdout>"
 yy940:
        YYDEBUG(940, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -15102,7 +15021,7 @@ yy942:
 yy943:
        YYDEBUG(943, *YYCURSOR);
 
-#line 1053 "resource/parse_date.re"
+#line 972 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("americanshort | american");
                TIMELIB_INIT;
@@ -15116,7 +15035,7 @@ yy943:
                TIMELIB_DEINIT;
                return TIMELIB_AMERICAN;
        }
-#line 13201 "<stdout>"
+#line 13120 "<stdout>"
 yy944:
        YYDEBUG(944, *YYCURSOR);
        yyaccept = 12;
@@ -15338,7 +15257,7 @@ yy975:
 yy976:
        YYDEBUG(976, *YYCURSOR);
 
-#line 1280 "resource/parse_date.re"
+#line 1199 "resource/parse_date.re"
 {
                int tz_not_found;
                DEBUG_OUTPUT("clf");
@@ -15356,7 +15275,7 @@ yy976:
                TIMELIB_DEINIT;
                return TIMELIB_CLF;
        }
-#line 13375 "<stdout>"
+#line 13294 "<stdout>"
 yy977:
        YYDEBUG(977, *YYCURSOR);
        yyaccept = 13;
@@ -15665,7 +15584,7 @@ yy1015:
 yy1016:
        YYDEBUG(1016, *YYCURSOR);
 
-#line 1267 "resource/parse_date.re"
+#line 1186 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("pgtextreverse");
                TIMELIB_INIT;
@@ -15677,7 +15596,7 @@ yy1016:
                TIMELIB_DEINIT;
                return TIMELIB_PG_TEXT;
        }
-#line 13615 "<stdout>"
+#line 13534 "<stdout>"
 yy1017:
        YYDEBUG(1017, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -15810,7 +15729,7 @@ yy1027:
 yy1028:
        YYDEBUG(1028, *YYCURSOR);
 
-#line 1299 "resource/parse_date.re"
+#line 1218 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("year4");
                TIMELIB_INIT;
@@ -15818,7 +15737,7 @@ yy1028:
                TIMELIB_DEINIT;
                return TIMELIB_CLF;
        }
-#line 13731 "<stdout>"
+#line 13650 "<stdout>"
 yy1029:
        YYDEBUG(1029, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -15954,7 +15873,7 @@ yy1036:
 yy1037:
        YYDEBUG(1037, *YYCURSOR);
 
-#line 1132 "resource/parse_date.re"
+#line 1051 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("datenodayrev");
                TIMELIB_INIT;
@@ -15966,7 +15885,7 @@ yy1037:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_NO_DAY;
        }
-#line 13858 "<stdout>"
+#line 13777 "<stdout>"
 yy1038:
        YYDEBUG(1038, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -16175,7 +16094,7 @@ yy1056:
 yy1057:
        YYDEBUG(1057, *YYCURSOR);
 
-#line 1235 "resource/parse_date.re"
+#line 1154 "resource/parse_date.re"
 {
                timelib_sll w, d;
                DEBUG_OUTPUT("isoweek");
@@ -16193,7 +16112,7 @@ yy1057:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_WEEK;
        }
-#line 14045 "<stdout>"
+#line 13964 "<stdout>"
 yy1058:
        YYDEBUG(1058, *YYCURSOR);
        ++YYCURSOR;
@@ -16201,7 +16120,7 @@ yy1058:
 yy1059:
        YYDEBUG(1059, *YYCURSOR);
 
-#line 1216 "resource/parse_date.re"
+#line 1135 "resource/parse_date.re"
 {
                timelib_sll w, d;
                DEBUG_OUTPUT("isoweekday");
@@ -16219,7 +16138,7 @@ yy1059:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_WEEK;
        }
-#line 14067 "<stdout>"
+#line 13986 "<stdout>"
 yy1060:
        YYDEBUG(1060, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -16288,7 +16207,7 @@ yy1062:
 yy1063:
        YYDEBUG(1063, *YYCURSOR);
 
-#line 1203 "resource/parse_date.re"
+#line 1122 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("pgydotd");
                TIMELIB_INIT;
@@ -16300,7 +16219,7 @@ yy1063:
                TIMELIB_DEINIT;
                return TIMELIB_PG_YEARDAY;
        }
-#line 14140 "<stdout>"
+#line 14059 "<stdout>"
 yy1064:
        YYDEBUG(1064, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -16415,7 +16334,7 @@ yy1069:
 yy1070:
        YYDEBUG(1070, *YYCURSOR);
 
-#line 1169 "resource/parse_date.re"
+#line 1088 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("datenocolon");
                TIMELIB_INIT;
@@ -16426,7 +16345,7 @@ yy1070:
                TIMELIB_DEINIT;
                return TIMELIB_DATE_NOCOLON;
        }
-#line 14248 "<stdout>"
+#line 14167 "<stdout>"
 yy1071:
        YYDEBUG(1071, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -16524,7 +16443,7 @@ yy1080:
 yy1081:
        YYDEBUG(1081, *YYCURSOR);
 
-#line 1181 "resource/parse_date.re"
+#line 1100 "resource/parse_date.re"
 {
                int tz_not_found;
                DEBUG_OUTPUT("xmlrpc | xmlrpcnocolon | soap | wddx");
@@ -16545,7 +16464,7 @@ yy1081:
                TIMELIB_DEINIT;
                return TIMELIB_XMLRPC_SOAP;
        }
-#line 14345 "<stdout>"
+#line 14264 "<stdout>"
 yy1082:
        YYDEBUG(1082, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -17148,7 +17067,7 @@ yy1171:
 yy1172:
        YYDEBUG(1172, *YYCURSOR);
 
-#line 1068 "resource/parse_date.re"
+#line 987 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("iso8601date | iso8601dateslash | dateslash");
                TIMELIB_INIT;
@@ -17159,7 +17078,7 @@ yy1172:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_DATE;
        }
-#line 14777 "<stdout>"
+#line 14696 "<stdout>"
 yy1173:
        YYDEBUG(1173, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -17932,7 +17851,7 @@ yy1262:
 yy1263:
        YYDEBUG(1263, *YYCURSOR);
 
-#line 990 "resource/parse_date.re"
+#line 909 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("gnunocolon");
                TIMELIB_INIT;
@@ -17953,7 +17872,7 @@ yy1263:
                TIMELIB_DEINIT;
                return TIMELIB_GNU_NOCOLON;
        }
-#line 15387 "<stdout>"
+#line 15306 "<stdout>"
 yy1264:
        YYDEBUG(1264, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -18050,7 +17969,7 @@ yy1270:
 yy1271:
        YYDEBUG(1271, *YYCURSOR);
 
-#line 1035 "resource/parse_date.re"
+#line 954 "resource/parse_date.re"
 {
                int tz_not_found;
                DEBUG_OUTPUT("iso8601nocolon");
@@ -18067,7 +17986,7 @@ yy1271:
                TIMELIB_DEINIT;
                return TIMELIB_ISO_NOCOLON;
        }
-#line 15485 "<stdout>"
+#line 15404 "<stdout>"
 yy1272:
        YYDEBUG(1272, *YYCURSOR);
        yyaccept = 21;
@@ -18364,7 +18283,7 @@ yy1295:
 yy1296:
        YYDEBUG(1296, *YYCURSOR);
 
-#line 927 "resource/parse_date.re"
+#line 846 "resource/parse_date.re"
 {
                timelib_ull i;
 
@@ -18387,7 +18306,7 @@ yy1296:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 15749 "<stdout>"
+#line 15668 "<stdout>"
 yy1297:
        YYDEBUG(1297, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -18458,7 +18377,7 @@ yy1304:
 yy1305:
        YYDEBUG(1305, *YYCURSOR);
 
-#line 915 "resource/parse_date.re"
+#line 834 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("tomorrow");
                TIMELIB_INIT;
@@ -18469,7 +18388,7 @@ yy1305:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 15813 "<stdout>"
+#line 15732 "<stdout>"
 yy1306:
        YYDEBUG(1306, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -18482,7 +18401,7 @@ yy1307:
 yy1308:
        YYDEBUG(1308, *YYCURSOR);
 
-#line 905 "resource/parse_date.re"
+#line 824 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("today");
                TIMELIB_INIT;
@@ -18491,7 +18410,7 @@ yy1308:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 15829 "<stdout>"
+#line 15748 "<stdout>"
 yy1309:
        YYDEBUG(1309, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -18525,7 +18444,7 @@ yy1310:
 yy1311:
        YYDEBUG(1311, *YYCURSOR);
 
-#line 896 "resource/parse_date.re"
+#line 815 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("now");
                TIMELIB_INIT;
@@ -18533,7 +18452,7 @@ yy1311:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 15865 "<stdout>"
+#line 15784 "<stdout>"
 yy1312:
        YYDEBUG(1312, *YYCURSOR);
        yych = *++YYCURSOR;
@@ -18591,7 +18510,7 @@ yy1319:
 yy1320:
        YYDEBUG(1320, *YYCURSOR);
 
-#line 884 "resource/parse_date.re"
+#line 803 "resource/parse_date.re"
 {
                DEBUG_OUTPUT("yesterday");
                TIMELIB_INIT;
@@ -18602,10 +18521,10 @@ yy1320:
                TIMELIB_DEINIT;
                return TIMELIB_RELATIVE;
        }
-#line 15916 "<stdout>"
+#line 15835 "<stdout>"
 }
 }
-#line 1432 "resource/parse_date.re"
+#line 1351 "resource/parse_date.re"
 
 }
 
@@ -18682,11 +18601,11 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options)
 */
 }
 
-char *timelib_timezone_id_from_abbr(const char *abbr)
+char *timelib_timezone_id_from_abbr(const char *abbr, long gmtoffset, int isdst)
 {
        timelib_tz_lookup_table *tp;
 
-       tp = zone_search(abbr, 0, sizeof(timelib_timezone_lookup) / sizeof(*timelib_timezone_lookup) - 1);
+       tp = zone_search(abbr, gmtoffset, isdst);
        if (tp) {
                return (tp->full_tz_name);
        } else {
index a3fdcfa89443b7d2c76d1b6c39522bd7b298baef..f5ca76b12aefcc14955befa8a070a411d422f1fa 100644 (file)
@@ -160,108 +160,13 @@ typedef struct _timelib_relunit {
 
 /* The timezone table. */
 static timelib_tz_lookup_table timelib_timezone_lookup[] = {
-       { "a",    0,    HOUR (- 1), NULL                  },
-       { "adt",  1,    HOUR (  4), "America/Halifax"     }, /* Atlantic Daylight */
-       { "ahst", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska-Hawaii Standard */
-       { "akdt", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska Daylight */
-       { "akst", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska Standard */
-       { "ast",  0,    HOUR (  4), "America/Halifax"     }, /* Atlantic Standard */
-       { "at",   0,    HOUR (  2), "Atlantic/Azores"     }, /* Azores */
-       { "b",    0,    HOUR (- 2), NULL                  },
-       { "bst",  1,    HOUR (  0), "Europe/London"       }, /* British Summer */
-       { "bt",   0,   -HOUR (  3), "Asia/Baghdad"        }, /* Baghdad, USSR Zone 2 */
-       { "c",    0,    HOUR (- 3), NULL                  },
-       { "cadt", 1,   -HOUR (9.5), "Australia/Adelaide"  }, /* Central Australian Daylight */
-       { "cast", 0,   -HOUR (9.5), "Australia/Adelaide"  }, /* Central Australian Standard */
-       { "cat",  0,    HOUR ( 10), "America/Anchorage"   }, /* Central Alaska */
-       { "cct",  0,   -HOUR (  8), "Asia/Shanghai"       }, /* China Coast, USSR Zone 7 */
-       { "cdt",  1,    HOUR (  6), "America/Chicago"     }, /* Central Daylight */
-       { "cest", 1,   -HOUR (  1), "Europe/Berlin"       }, /* Central European Summer */
-       { "cet",  0,   -HOUR (  1), "Europe/Berlin"       }, /* Central European */
-       { "cst",  0,    HOUR (  6), "America/Chicago"     }, /* Central Standard */
-       { "d",    0,    HOUR (- 4), NULL                  },
-       { "e",    0,    HOUR (- 5), NULL                  },
-       { "eadt", 1,   -HOUR ( 10), "Australia/Sydney"    }, /* Eastern Australian Daylight */
-       { "east", 0,   -HOUR ( 10), "Australia/Sydney"    }, /* Eastern Australian Standard */
-       { "edt",  1,    HOUR (  5), "America/New_York"    }, /* Eastern Daylight */
-       { "eest", 1,    HOUR (  2), "Europe/Helsinki"     }, /* Eastern European Summer */
-       { "eet",  0,   -HOUR (  2), "Europe/Bucharest"    }, /* Eastern Europe, USSR Zone 1 */
-       { "est",  0,    HOUR (  5), "America/New_York"    }, /* Eastern Standard */
-       { "f",    0,    HOUR (- 6), NULL                  },
-       { "fst",  1,   -HOUR (  1), "Europe/Paris"        }, /* French Summer */
-       { "fwt",  0,   -HOUR (  1), "Europe/Paris"        }, /* French Winter */
-       { "g",    0,    HOUR (- 7), NULL                  },
-       { "gmt",  0,    HOUR (  0), "GMT"                 }, /* Greenwich Mean */
-       { "gst",  0,   -HOUR ( 10), "Pacific/Guam"        }, /* Guam Standard, USSR Zone 9 */
-       { "h",    0,    HOUR (- 8), NULL                  },
-       { "hdt",  1,    HOUR ( 10), "Pacific/Honolulu"    }, /* Hawaii Daylight */
-       { "hst",  0,    HOUR ( 10), "Pacific/Honolulu"    }, /* Hawaii Standard */
-       { "i",    0,    HOUR (- 9), NULL                  },
-       { "idle", 0,   -HOUR ( 12), "NZ"                  }, /* International Date Line East */
-       { "idlw", 0,    HOUR ( 12), NULL                  }, /* International Date Line West */
-       { "ist",  0,   -HOUR (5.5), "Asia/Calcutta"       }, /* Indian Standard */
-       { "it",   0,   -HOUR (3.5), "Asia/Tehran"         }, /* Iran */
-       { "jst",  0,   -HOUR (  9), "Asia/Tokyo"          }, /* Japan Standard, USSR Zone 8 */
-       { "jt",   0,   -HOUR (7.5), NULL                  }, /* Java (3pm in Cronusland!) */
-       { "k",    0,    HOUR (-10), NULL                  },
-       { "l",    0,    HOUR (-11), NULL                  },
-       { "m",    0,    HOUR (-12), NULL                  },
-       { "mdt",  1,    HOUR (  7), "America/Phoenix"     }, /* Mountain Daylight */
-       { "mest", 1,   -HOUR (  1), "MET"                 }, /* Middle European Summer */
-       { "mesz", 1,   -HOUR (  1), "MET"                 }, /* Middle European Summer */
-       { "met",  0,   -HOUR (  1), "MET"                 }, /* Middle European */
-       { "mewt", 0,   -HOUR (  1), "MET"                 }, /* Middle European Winter */
-       { "msd",  1,    HOUR (  3), "Europe/Moscow"       }, /* Moscow Summer */
-       { "msk",  0,    HOUR (  3), "Europe/Moscow"       }, /* Moscow */
-       { "mst",  0,    HOUR (  7), "America/Phoenix"     }, /* Mountain Standard */
-       { "n",    0,    HOUR (  1), NULL                  },
-       { "ndt",  1,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland Daylight */
-       { "nft",  0,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland */
-       { "nst",  0,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland Standard */
-       { "nt",   0,    HOUR ( 11), NULL                  }, /* Nome */
-       { "nzdt", 1,   -HOUR ( 12), "NZ"                  }, /* New Zealand Daylight */
-       { "nzst", 0,   -HOUR ( 12), "NZ"                  }, /* New Zealand Standard */
-       { "nzt",  0,   -HOUR ( 12), "NZ"                  }, /* New Zealand */
-       { "o",    0,    HOUR (  2), NULL                  },
-       { "p",    0,    HOUR (  3), NULL                  },
-       { "pdt",  1,    HOUR (  8), "America/Los_Angeles" }, /* Pacific Daylight */
-       { "pst",  0,    HOUR (  8), "America/Los_Angeles" }, /* Pacific Standard */
-       { "q",    0,    HOUR (  4), NULL                  },
-       { "r",    0,    HOUR (  5), NULL                  },
-       { "s",    0,    HOUR (  6), NULL                  },
-       { "slst", 1,   -HOUR (  1), "Europe/Oslo"         }, /* Skien Local Summer Time */
-       { "slt",  0,   -HOUR (  1), "Europe/Oslo"         }, /* Skien Local Time */
-       { "sst",  1,   -HOUR (  1), "Europe/Stockholm"    }, /* Swedish Summer */
-       { "swt",  0,   -HOUR (  1), "Europe/Stockholm"    }, /* Swedish Winter */
-       { "t",    0,    HOUR (  7), NULL                  },
-       { "u",    0,    HOUR (  8), NULL                  },
-       { "ut",   0,    HOUR (  0), "UTC"                 }, /* Universal (Coordinated) */
-       { "utc",  0,    HOUR (  0), "UTC"                 },
-       { "v",    0,    HOUR (  9), NULL                  },
-       { "w",    0,    HOUR ( 10), NULL                  },
-       { "wadt", 1,   -HOUR (  7), "Australia/Perth"     }, /* West Australian Daylight */
-       { "wast", 0,   -HOUR (  7), "Australia/Perth"     }, /* West Australian Standard */
-       { "wat",  0,    HOUR (  1), "Africa/Dakar"        }, /* West Africa */
-       { "wet",  0,    HOUR (  0), "Europe/London"       }, /* Western European */
-       { "x",    0,    HOUR ( 11), NULL                  },
-       { "y",    0,    HOUR ( 12), NULL                  },
-       { "ydt",  1,    HOUR (  9), "America/Anchorage"   }, /* Yukon Daylight */
-       { "yst",  0,    HOUR (  9), "America/Anchorage"   }, /* Yukon Standard */
-       { "z",    0,    HOUR (  0), NULL                  },
-       { "zp4",  0,   -HOUR (  4), NULL                  }, /* USSR Zone 3 */
-       { "zp5",  0,   -HOUR (  5), NULL                  }, /* USSR Zone 4 */
-       { "zp6",  0,   -HOUR (  6), NULL                  }, /* USSR Zone 5 */
-#if 0
-       /* For completeness.  BST is also British Summer, and GST is
-        * also Guam Standard. */
-       { "bst",  0,   HOUR ( 3), NULL },  /* Brazil Standard */
-       { "gst",  0,   HOUR ( 3), NULL },  /* Greenland Standard */
-
-       /* For completeness.  NST is also Newfoundland Standard, and SST is
-        * also Swedish Summer. */
-       { "nst",  0,   -HOUR (6.5), NULL },/* North Sumatra */
-       { "sst",  0,   -HOUR (7), NULL },  /* South Sumatra, USSR Zone 6 */
-#endif
+#include "timezonemap.h"
+       { NULL, 0, 0, NULL },
+};
+
+static timelib_tz_lookup_table timelib_timezone_fallbackmap[] = {
+#include "fallbackmap.h"
+       { NULL, 0, 0, NULL },
 };
 
 static timelib_relunit const timelib_relunit_lookup[] = {
@@ -650,24 +555,37 @@ static void timelib_set_relative(char **ptr, timelib_sll amount, Scanner *s)
        }
 }
 
-static timelib_tz_lookup_table* zone_search(const char *word, int left, int right)
+static timelib_tz_lookup_table* zone_search(const char *word, long gmtoffset, int isdst)
 {
-       int mid, cmp;
-
-       if (left > right) {
-               return NULL; /* not found */
-       }
-       mid = (left + right) / 2;
-       cmp = strcasecmp(word, timelib_timezone_lookup[mid].name);
-       if (cmp < 0) {
-               return zone_search(word, left, mid - 1);
-       } else if (cmp > 0) {
-               return zone_search(word, mid + 1, right);
-       } else { /* (cmp == 0) */
-               return (timelib_tz_lookup_table*)&timelib_timezone_lookup[mid];
+       int first_found = 0;
+       timelib_tz_lookup_table  *tp, *first_found_elem;
+       timelib_tz_lookup_table  *fmp;
+       
+       for (tp = timelib_timezone_lookup; tp->name; tp++) {
+               if (strcasecmp(word, tp->name) == 0) {
+                       if (!first_found) {
+                               first_found = 1;
+                               first_found_elem = tp;
+                               if (gmtoffset == -1) {
+                                       return tp;
+                               }
+                       }
+                       if (tp->gmtoffset == gmtoffset) {
+                               return tp;
+                       }
+               }
+       }
+       if (first_found) {
+               return first_found_elem;
+       }
+       /* Still didn't find anything, let's find the zone solely based on
+        * offset/isdst then */
+       for (fmp = timelib_timezone_fallbackmap; fmp->name; fmp++) {
+               if ((fmp->gmtoffset * 3600) == gmtoffset && fmp->type == isdst) {
+                       return fmp;
+               }
        }
+       return NULL;
 }
 
 static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found)
@@ -684,9 +602,10 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found
        word = calloc(1, end - begin + 1);
        memcpy(word, begin, end - begin);
 
-       if ((tp = zone_search(word, 0, sizeof(timelib_timezone_lookup)/sizeof(*timelib_timezone_lookup)-1))) {
-               value = tp->value;
+       if ((tp = zone_search(word, -1, 0))) {
+               value = -tp->gmtoffset / 60;
                *dst = tp->type;
+               value += tp->type * 60;
                *found = 1;
        } else {
                *found = 0;
@@ -1504,11 +1423,11 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options)
 */
 }
 
-char *timelib_timezone_id_from_abbr(const char *abbr)
+char *timelib_timezone_id_from_abbr(const char *abbr, long gmtoffset, int isdst)
 {
        timelib_tz_lookup_table *tp;
 
-       tp = zone_search(abbr, 0, sizeof(timelib_timezone_lookup) / sizeof(*timelib_timezone_lookup) - 1);
+       tp = zone_search(abbr, gmtoffset, isdst);
        if (tp) {
                return (tp->full_tz_name);
        } else {
index a3fdcfa89443b7d2c76d1b6c39522bd7b298baef..f5ca76b12aefcc14955befa8a070a411d422f1fa 100644 (file)
@@ -160,108 +160,13 @@ typedef struct _timelib_relunit {
 
 /* The timezone table. */
 static timelib_tz_lookup_table timelib_timezone_lookup[] = {
-       { "a",    0,    HOUR (- 1), NULL                  },
-       { "adt",  1,    HOUR (  4), "America/Halifax"     }, /* Atlantic Daylight */
-       { "ahst", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska-Hawaii Standard */
-       { "akdt", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska Daylight */
-       { "akst", 0,    HOUR ( 10), "America/Anchorage"   }, /* Alaska Standard */
-       { "ast",  0,    HOUR (  4), "America/Halifax"     }, /* Atlantic Standard */
-       { "at",   0,    HOUR (  2), "Atlantic/Azores"     }, /* Azores */
-       { "b",    0,    HOUR (- 2), NULL                  },
-       { "bst",  1,    HOUR (  0), "Europe/London"       }, /* British Summer */
-       { "bt",   0,   -HOUR (  3), "Asia/Baghdad"        }, /* Baghdad, USSR Zone 2 */
-       { "c",    0,    HOUR (- 3), NULL                  },
-       { "cadt", 1,   -HOUR (9.5), "Australia/Adelaide"  }, /* Central Australian Daylight */
-       { "cast", 0,   -HOUR (9.5), "Australia/Adelaide"  }, /* Central Australian Standard */
-       { "cat",  0,    HOUR ( 10), "America/Anchorage"   }, /* Central Alaska */
-       { "cct",  0,   -HOUR (  8), "Asia/Shanghai"       }, /* China Coast, USSR Zone 7 */
-       { "cdt",  1,    HOUR (  6), "America/Chicago"     }, /* Central Daylight */
-       { "cest", 1,   -HOUR (  1), "Europe/Berlin"       }, /* Central European Summer */
-       { "cet",  0,   -HOUR (  1), "Europe/Berlin"       }, /* Central European */
-       { "cst",  0,    HOUR (  6), "America/Chicago"     }, /* Central Standard */
-       { "d",    0,    HOUR (- 4), NULL                  },
-       { "e",    0,    HOUR (- 5), NULL                  },
-       { "eadt", 1,   -HOUR ( 10), "Australia/Sydney"    }, /* Eastern Australian Daylight */
-       { "east", 0,   -HOUR ( 10), "Australia/Sydney"    }, /* Eastern Australian Standard */
-       { "edt",  1,    HOUR (  5), "America/New_York"    }, /* Eastern Daylight */
-       { "eest", 1,    HOUR (  2), "Europe/Helsinki"     }, /* Eastern European Summer */
-       { "eet",  0,   -HOUR (  2), "Europe/Bucharest"    }, /* Eastern Europe, USSR Zone 1 */
-       { "est",  0,    HOUR (  5), "America/New_York"    }, /* Eastern Standard */
-       { "f",    0,    HOUR (- 6), NULL                  },
-       { "fst",  1,   -HOUR (  1), "Europe/Paris"        }, /* French Summer */
-       { "fwt",  0,   -HOUR (  1), "Europe/Paris"        }, /* French Winter */
-       { "g",    0,    HOUR (- 7), NULL                  },
-       { "gmt",  0,    HOUR (  0), "GMT"                 }, /* Greenwich Mean */
-       { "gst",  0,   -HOUR ( 10), "Pacific/Guam"        }, /* Guam Standard, USSR Zone 9 */
-       { "h",    0,    HOUR (- 8), NULL                  },
-       { "hdt",  1,    HOUR ( 10), "Pacific/Honolulu"    }, /* Hawaii Daylight */
-       { "hst",  0,    HOUR ( 10), "Pacific/Honolulu"    }, /* Hawaii Standard */
-       { "i",    0,    HOUR (- 9), NULL                  },
-       { "idle", 0,   -HOUR ( 12), "NZ"                  }, /* International Date Line East */
-       { "idlw", 0,    HOUR ( 12), NULL                  }, /* International Date Line West */
-       { "ist",  0,   -HOUR (5.5), "Asia/Calcutta"       }, /* Indian Standard */
-       { "it",   0,   -HOUR (3.5), "Asia/Tehran"         }, /* Iran */
-       { "jst",  0,   -HOUR (  9), "Asia/Tokyo"          }, /* Japan Standard, USSR Zone 8 */
-       { "jt",   0,   -HOUR (7.5), NULL                  }, /* Java (3pm in Cronusland!) */
-       { "k",    0,    HOUR (-10), NULL                  },
-       { "l",    0,    HOUR (-11), NULL                  },
-       { "m",    0,    HOUR (-12), NULL                  },
-       { "mdt",  1,    HOUR (  7), "America/Phoenix"     }, /* Mountain Daylight */
-       { "mest", 1,   -HOUR (  1), "MET"                 }, /* Middle European Summer */
-       { "mesz", 1,   -HOUR (  1), "MET"                 }, /* Middle European Summer */
-       { "met",  0,   -HOUR (  1), "MET"                 }, /* Middle European */
-       { "mewt", 0,   -HOUR (  1), "MET"                 }, /* Middle European Winter */
-       { "msd",  1,    HOUR (  3), "Europe/Moscow"       }, /* Moscow Summer */
-       { "msk",  0,    HOUR (  3), "Europe/Moscow"       }, /* Moscow */
-       { "mst",  0,    HOUR (  7), "America/Phoenix"     }, /* Mountain Standard */
-       { "n",    0,    HOUR (  1), NULL                  },
-       { "ndt",  1,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland Daylight */
-       { "nft",  0,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland */
-       { "nst",  0,    HOUR (3.5), "America/St_Johns"    }, /* Newfoundland Standard */
-       { "nt",   0,    HOUR ( 11), NULL                  }, /* Nome */
-       { "nzdt", 1,   -HOUR ( 12), "NZ"                  }, /* New Zealand Daylight */
-       { "nzst", 0,   -HOUR ( 12), "NZ"                  }, /* New Zealand Standard */
-       { "nzt",  0,   -HOUR ( 12), "NZ"                  }, /* New Zealand */
-       { "o",    0,    HOUR (  2), NULL                  },
-       { "p",    0,    HOUR (  3), NULL                  },
-       { "pdt",  1,    HOUR (  8), "America/Los_Angeles" }, /* Pacific Daylight */
-       { "pst",  0,    HOUR (  8), "America/Los_Angeles" }, /* Pacific Standard */
-       { "q",    0,    HOUR (  4), NULL                  },
-       { "r",    0,    HOUR (  5), NULL                  },
-       { "s",    0,    HOUR (  6), NULL                  },
-       { "slst", 1,   -HOUR (  1), "Europe/Oslo"         }, /* Skien Local Summer Time */
-       { "slt",  0,   -HOUR (  1), "Europe/Oslo"         }, /* Skien Local Time */
-       { "sst",  1,   -HOUR (  1), "Europe/Stockholm"    }, /* Swedish Summer */
-       { "swt",  0,   -HOUR (  1), "Europe/Stockholm"    }, /* Swedish Winter */
-       { "t",    0,    HOUR (  7), NULL                  },
-       { "u",    0,    HOUR (  8), NULL                  },
-       { "ut",   0,    HOUR (  0), "UTC"                 }, /* Universal (Coordinated) */
-       { "utc",  0,    HOUR (  0), "UTC"                 },
-       { "v",    0,    HOUR (  9), NULL                  },
-       { "w",    0,    HOUR ( 10), NULL                  },
-       { "wadt", 1,   -HOUR (  7), "Australia/Perth"     }, /* West Australian Daylight */
-       { "wast", 0,   -HOUR (  7), "Australia/Perth"     }, /* West Australian Standard */
-       { "wat",  0,    HOUR (  1), "Africa/Dakar"        }, /* West Africa */
-       { "wet",  0,    HOUR (  0), "Europe/London"       }, /* Western European */
-       { "x",    0,    HOUR ( 11), NULL                  },
-       { "y",    0,    HOUR ( 12), NULL                  },
-       { "ydt",  1,    HOUR (  9), "America/Anchorage"   }, /* Yukon Daylight */
-       { "yst",  0,    HOUR (  9), "America/Anchorage"   }, /* Yukon Standard */
-       { "z",    0,    HOUR (  0), NULL                  },
-       { "zp4",  0,   -HOUR (  4), NULL                  }, /* USSR Zone 3 */
-       { "zp5",  0,   -HOUR (  5), NULL                  }, /* USSR Zone 4 */
-       { "zp6",  0,   -HOUR (  6), NULL                  }, /* USSR Zone 5 */
-#if 0
-       /* For completeness.  BST is also British Summer, and GST is
-        * also Guam Standard. */
-       { "bst",  0,   HOUR ( 3), NULL },  /* Brazil Standard */
-       { "gst",  0,   HOUR ( 3), NULL },  /* Greenland Standard */
-
-       /* For completeness.  NST is also Newfoundland Standard, and SST is
-        * also Swedish Summer. */
-       { "nst",  0,   -HOUR (6.5), NULL },/* North Sumatra */
-       { "sst",  0,   -HOUR (7), NULL },  /* South Sumatra, USSR Zone 6 */
-#endif
+#include "timezonemap.h"
+       { NULL, 0, 0, NULL },
+};
+
+static timelib_tz_lookup_table timelib_timezone_fallbackmap[] = {
+#include "fallbackmap.h"
+       { NULL, 0, 0, NULL },
 };
 
 static timelib_relunit const timelib_relunit_lookup[] = {
@@ -650,24 +555,37 @@ static void timelib_set_relative(char **ptr, timelib_sll amount, Scanner *s)
        }
 }
 
-static timelib_tz_lookup_table* zone_search(const char *word, int left, int right)
+static timelib_tz_lookup_table* zone_search(const char *word, long gmtoffset, int isdst)
 {
-       int mid, cmp;
-
-       if (left > right) {
-               return NULL; /* not found */
-       }
-       mid = (left + right) / 2;
-       cmp = strcasecmp(word, timelib_timezone_lookup[mid].name);
-       if (cmp < 0) {
-               return zone_search(word, left, mid - 1);
-       } else if (cmp > 0) {
-               return zone_search(word, mid + 1, right);
-       } else { /* (cmp == 0) */
-               return (timelib_tz_lookup_table*)&timelib_timezone_lookup[mid];
+       int first_found = 0;
+       timelib_tz_lookup_table  *tp, *first_found_elem;
+       timelib_tz_lookup_table  *fmp;
+       
+       for (tp = timelib_timezone_lookup; tp->name; tp++) {
+               if (strcasecmp(word, tp->name) == 0) {
+                       if (!first_found) {
+                               first_found = 1;
+                               first_found_elem = tp;
+                               if (gmtoffset == -1) {
+                                       return tp;
+                               }
+                       }
+                       if (tp->gmtoffset == gmtoffset) {
+                               return tp;
+                       }
+               }
+       }
+       if (first_found) {
+               return first_found_elem;
+       }
+       /* Still didn't find anything, let's find the zone solely based on
+        * offset/isdst then */
+       for (fmp = timelib_timezone_fallbackmap; fmp->name; fmp++) {
+               if ((fmp->gmtoffset * 3600) == gmtoffset && fmp->type == isdst) {
+                       return fmp;
+               }
        }
+       return NULL;
 }
 
 static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found)
@@ -684,9 +602,10 @@ static long timelib_lookup_zone(char **ptr, int *dst, char **tz_abbr, int *found
        word = calloc(1, end - begin + 1);
        memcpy(word, begin, end - begin);
 
-       if ((tp = zone_search(word, 0, sizeof(timelib_timezone_lookup)/sizeof(*timelib_timezone_lookup)-1))) {
-               value = tp->value;
+       if ((tp = zone_search(word, -1, 0))) {
+               value = -tp->gmtoffset / 60;
                *dst = tp->type;
+               value += tp->type * 60;
                *found = 1;
        } else {
                *found = 0;
@@ -1504,11 +1423,11 @@ void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options)
 */
 }
 
-char *timelib_timezone_id_from_abbr(const char *abbr)
+char *timelib_timezone_id_from_abbr(const char *abbr, long gmtoffset, int isdst)
 {
        timelib_tz_lookup_table *tp;
 
-       tp = zone_search(abbr, 0, sizeof(timelib_timezone_lookup) / sizeof(*timelib_timezone_lookup) - 1);
+       tp = zone_search(abbr, gmtoffset, isdst);
        if (tp) {
                return (tp->full_tz_name);
        } else {
index ab3507f97b86dc5b8cbf0b1cfc62fe8c2a36190d..8e6f5a7244e85bc4bab36f06d89e31154c4d2ac4 100644 (file)
@@ -49,7 +49,7 @@ void timelib_isoweek_from_date(timelib_sll y, timelib_sll m, timelib_sll d, time
 /* From parse_date.re */
 timelib_time *timelib_strtotime(char *s, int *errors);
 void timelib_fill_holes(timelib_time *parsed, timelib_time *now, int options);
-char *timelib_timezone_id_from_abbr(const char *abbr);
+char *timelib_timezone_id_from_abbr(const char *abbr, long gmtoffset, int isdst);
 timelib_tz_lookup_table *timelib_timezone_abbreviations_list(void);
 
 /* From tm2unixtime.c */
index 7648318016d1d291fd316cd5da9fd39fe9f040b2..dfaf72a68022b0b9feb5e35d580dfa9a78888415 100644 (file)
@@ -149,7 +149,7 @@ typedef struct timelib_time {
 typedef struct _timelib_tz_lookup_table {
        char       *name;
        int         type;
-       int         value;
+       int         gmtoffset;
        char       *full_tz_name;
 } timelib_tz_lookup_table;
 
diff --git a/ext/date/lib/timezonemap.h b/ext/date/lib/timezonemap.h
new file mode 100644 (file)
index 0000000..d2ec99d
--- /dev/null
@@ -0,0 +1,1627 @@
+       { "acst",  1, -14400, "America/Porto_Acre"            },
+       { "acst",  1, -14400, "America/Eirunepe"              },
+       { "acst",  1, -14400, "America/Rio_Branco"            },
+       { "acst",  1, -14400, "Brazil/Acre"                   },
+       { "act",   0, -18000, "America/Porto_Acre"            },
+       { "act",   0, -18000, "America/Eirunepe"              },
+       { "act",   0, -18000, "America/Rio_Branco"            },
+       { "act",   0, -18000, "Brazil/Acre"                   },
+       { "addt",  1,  -7200, "America/Goose_Bay"             },
+       { "addt",  1,  -7200, "America/Pangnirtung"           },
+       { "adt",   1, -10800, "America/Halifax"               },
+       { "adt",   1, -10800, "America/Barbados"              },
+       { "adt",   1, -10800, "America/Glace_Bay"             },
+       { "adt",   1, -10800, "America/Goose_Bay"             },
+       { "adt",   1, -10800, "America/Martinique"            },
+       { "adt",   1, -10800, "America/Pangnirtung"           },
+       { "adt",   1, -10800, "America/Thule"                 },
+       { "adt",   1, -10800, "Atlantic/Bermuda"              },
+       { "adt",   1, -10800, "Canada/Atlantic"               },
+       { "adt",   1,  14400, "Asia/Baghdad"                  },
+       { "aft",   0,  16200, "Asia/Kabul"                    },
+       { "ahdt",  1, -32400, "America/Anchorage"             },
+       { "ahdt",  1, -32400, "US/Alaska"                     },
+       { "ahst",  0, -36000, "America/Anchorage"             },
+       { "ahst",  0, -36000, "America/Adak"                  },
+       { "ahst",  0, -36000, "America/Atka"                  },
+       { "ahst",  0, -36000, "US/Alaska"                     },
+       { "ahst",  0, -36000, "US/Aleutian"                   },
+       { "akdt",  1, -28800, "America/Anchorage"             },
+       { "akdt",  1, -28800, "America/Juneau"                },
+       { "akdt",  1, -28800, "America/Nome"                  },
+       { "akdt",  1, -28800, "America/Yakutat"               },
+       { "akdt",  1, -28800, "US/Alaska"                     },
+       { "akst",  0, -32400, "America/Anchorage"             },
+       { "akst",  0, -32400, "America/Juneau"                },
+       { "akst",  0, -32400, "America/Nome"                  },
+       { "akst",  0, -32400, "America/Yakutat"               },
+       { "akst",  0, -32400, "US/Alaska"                     },
+       { "aktst", 1,  21600, "Asia/Aqtobe"                   },
+       { "aktt",  0,  14400, "Asia/Aqtobe"                   },
+       { "aktt",  0,  18000, "Asia/Aqtobe"                   },
+       { "aktt",  0,  21600, "Asia/Aqtobe"                   },
+       { "almst", 1,  25200, "Asia/Almaty"                   },
+       { "almt",  0,  18000, "Asia/Almaty"                   },
+       { "almt",  0,  21600, "Asia/Almaty"                   },
+       { "amst",  1,  14400, "Asia/Yerevan"                  },
+       { "amst",  1,  18000, "Asia/Yerevan"                  },
+       { "amst",  1, -10800, "America/Boa_Vista"             },
+       { "amst",  1, -10800, "America/Campo_Grande"          },
+       { "amst",  1, -10800, "America/Cuiaba"                },
+       { "amst",  1, -10800, "America/Manaus"                },
+       { "amst",  1, -10800, "America/Porto_Velho"           },
+       { "amst",  1, -10800, "Brazil/West"                   },
+       { "amt",   0,  10800, "Asia/Yerevan"                  },
+       { "amt",   0,  14400, "Asia/Yerevan"                  },
+       { "amt",   0, -14400, "America/Boa_Vista"             },
+       { "amt",   0, -14400, "America/Campo_Grande"          },
+       { "amt",   0, -14400, "America/Cuiaba"                },
+       { "amt",   0, -14400, "America/Manaus"                },
+       { "amt",   0, -14400, "America/Porto_Velho"           },
+       { "amt",   0, -14400, "Brazil/West"                   },
+       { "amt",   0,   1172, "Europe/Amsterdam"              },
+       { "anast", 1,  43200, "Asia/Anadyr"                   },
+       { "anast", 1,  46800, "Asia/Anadyr"                   },
+       { "anast", 1,  50400, "Asia/Anadyr"                   },
+       { "anat",  0,  39600, "Asia/Anadyr"                   },
+       { "anat",  0,  43200, "Asia/Anadyr"                   },
+       { "anat",  0,  46800, "Asia/Anadyr"                   },
+       { "ant",   0, -16200, "America/Curacao"               },
+       { "ant",   0, -16200, "America/Aruba"                 },
+       { "apt",   1, -10800, "America/Halifax"               },
+       { "apt",   1, -10800, "America/Glace_Bay"             },
+       { "apt",   1, -10800, "America/Pangnirtung"           },
+       { "apt",   1, -10800, "Canada/Atlantic"               },
+       { "aqtst", 1,  18000, "Asia/Aqtau"                    },
+       { "aqtst", 1,  21600, "Asia/Aqtau"                    },
+       { "aqtst", 1,  21600, "Asia/Aqtobe"                   },
+       { "aqtt",  0,  14400, "Asia/Aqtau"                    },
+       { "aqtt",  0,  18000, "Asia/Aqtau"                    },
+       { "aqtt",  0,  18000, "Asia/Aqtobe"                   },
+       { "arst",  1, -10800, "America/Buenos_Aires"          },
+       { "arst",  1,  -7200, "America/Buenos_Aires"          },
+       { "arst",  1, -10800, "America/Argentina/Buenos_Aires" },
+       { "arst",  1, -10800, "America/Argentina/Catamarca"   },
+       { "arst",  1, -10800, "America/Argentina/ComodRivadavia" },
+       { "arst",  1, -10800, "America/Argentina/Cordoba"     },
+       { "arst",  1, -10800, "America/Argentina/Jujuy"       },
+       { "arst",  1, -10800, "America/Argentina/La_Rioja"    },
+       { "arst",  1, -10800, "America/Argentina/Mendoza"     },
+       { "arst",  1, -10800, "America/Argentina/Rio_Gallegos" },
+       { "arst",  1, -10800, "America/Argentina/San_Juan"    },
+       { "arst",  1, -10800, "America/Argentina/Tucuman"     },
+       { "arst",  1, -10800, "America/Argentina/Ushuaia"     },
+       { "arst",  1, -10800, "America/Catamarca"             },
+       { "arst",  1, -10800, "America/Cordoba"               },
+       { "arst",  1, -10800, "America/Jujuy"                 },
+       { "arst",  1, -10800, "America/Mendoza"               },
+       { "arst",  1, -10800, "America/Rosario"               },
+       { "arst",  1, -10800, "Antarctica/Palmer"             },
+       { "arst",  1,  -7200, "America/Argentina/Buenos_Aires" },
+       { "arst",  1,  -7200, "America/Argentina/Catamarca"   },
+       { "arst",  1,  -7200, "America/Argentina/ComodRivadavia" },
+       { "arst",  1,  -7200, "America/Argentina/Cordoba"     },
+       { "arst",  1,  -7200, "America/Argentina/Jujuy"       },
+       { "arst",  1,  -7200, "America/Argentina/La_Rioja"    },
+       { "arst",  1,  -7200, "America/Argentina/Mendoza"     },
+       { "arst",  1,  -7200, "America/Argentina/Rio_Gallegos" },
+       { "arst",  1,  -7200, "America/Argentina/San_Juan"    },
+       { "arst",  1,  -7200, "America/Argentina/Tucuman"     },
+       { "arst",  1,  -7200, "America/Argentina/Ushuaia"     },
+       { "arst",  1,  -7200, "America/Catamarca"             },
+       { "arst",  1,  -7200, "America/Cordoba"               },
+       { "arst",  1,  -7200, "America/Jujuy"                 },
+       { "arst",  1,  -7200, "America/Mendoza"               },
+       { "arst",  1,  -7200, "America/Rosario"               },
+       { "arst",  1,  -7200, "Antarctica/Palmer"             },
+       { "art",   0, -10800, "America/Buenos_Aires"          },
+       { "art",   0, -14400, "America/Buenos_Aires"          },
+       { "art",   0, -10800, "America/Argentina/Buenos_Aires" },
+       { "art",   0, -10800, "America/Argentina/Catamarca"   },
+       { "art",   0, -10800, "America/Argentina/ComodRivadavia" },
+       { "art",   0, -10800, "America/Argentina/Cordoba"     },
+       { "art",   0, -10800, "America/Argentina/Jujuy"       },
+       { "art",   0, -10800, "America/Argentina/La_Rioja"    },
+       { "art",   0, -10800, "America/Argentina/Mendoza"     },
+       { "art",   0, -10800, "America/Argentina/Rio_Gallegos" },
+       { "art",   0, -10800, "America/Argentina/San_Juan"    },
+       { "art",   0, -10800, "America/Argentina/Tucuman"     },
+       { "art",   0, -10800, "America/Argentina/Ushuaia"     },
+       { "art",   0, -10800, "America/Catamarca"             },
+       { "art",   0, -10800, "America/Cordoba"               },
+       { "art",   0, -10800, "America/Jujuy"                 },
+       { "art",   0, -10800, "America/Mendoza"               },
+       { "art",   0, -10800, "America/Rosario"               },
+       { "art",   0, -10800, "Antarctica/Palmer"             },
+       { "art",   0, -14400, "America/Argentina/Buenos_Aires" },
+       { "art",   0, -14400, "America/Argentina/Catamarca"   },
+       { "art",   0, -14400, "America/Argentina/ComodRivadavia" },
+       { "art",   0, -14400, "America/Argentina/Cordoba"     },
+       { "art",   0, -14400, "America/Argentina/Jujuy"       },
+       { "art",   0, -14400, "America/Argentina/La_Rioja"    },
+       { "art",   0, -14400, "America/Argentina/Mendoza"     },
+       { "art",   0, -14400, "America/Argentina/Rio_Gallegos" },
+       { "art",   0, -14400, "America/Argentina/San_Juan"    },
+       { "art",   0, -14400, "America/Argentina/Tucuman"     },
+       { "art",   0, -14400, "America/Argentina/Ushuaia"     },
+       { "art",   0, -14400, "America/Catamarca"             },
+       { "art",   0, -14400, "America/Cordoba"               },
+       { "art",   0, -14400, "America/Jujuy"                 },
+       { "art",   0, -14400, "America/Mendoza"               },
+       { "art",   0, -14400, "America/Rosario"               },
+       { "art",   0, -14400, "Antarctica/Palmer"             },
+       { "ashst", 1,  18000, "Asia/Ashkhabad"                },
+       { "ashst", 1,  21600, "Asia/Ashkhabad"                },
+       { "ashst", 1,  18000, "Asia/Ashgabat"                 },
+       { "ashst", 1,  21600, "Asia/Ashgabat"                 },
+       { "asht",  0,  14400, "Asia/Ashkhabad"                },
+       { "asht",  0,  18000, "Asia/Ashkhabad"                },
+       { "asht",  0,  14400, "Asia/Ashgabat"                 },
+       { "asht",  0,  18000, "Asia/Ashgabat"                 },
+       { "ast",   0,  10800, "Asia/Riyadh"                   },
+       { "ast",   0, -14400, "America/Anguilla"              },
+       { "ast",   0, -14400, "America/Antigua"               },
+       { "ast",   0, -14400, "America/Aruba"                 },
+       { "ast",   0, -14400, "America/Barbados"              },
+       { "ast",   0, -14400, "America/Curacao"               },
+       { "ast",   0, -14400, "America/Dominica"              },
+       { "ast",   0, -14400, "America/Glace_Bay"             },
+       { "ast",   0, -14400, "America/Goose_Bay"             },
+       { "ast",   0, -14400, "America/Grenada"               },
+       { "ast",   0, -14400, "America/Guadeloupe"            },
+       { "ast",   0, -14400, "America/Halifax"               },
+       { "ast",   0, -14400, "America/Martinique"            },
+       { "ast",   0, -14400, "America/Miquelon"              },
+       { "ast",   0, -14400, "America/Montserrat"            },
+       { "ast",   0, -14400, "America/Pangnirtung"           },
+       { "ast",   0, -14400, "America/Port_of_Spain"         },
+       { "ast",   0, -14400, "America/Puerto_Rico"           },
+       { "ast",   0, -14400, "America/Santo_Domingo"         },
+       { "ast",   0, -14400, "America/St_Kitts"              },
+       { "ast",   0, -14400, "America/St_Lucia"              },
+       { "ast",   0, -14400, "America/St_Thomas"             },
+       { "ast",   0, -14400, "America/St_Vincent"            },
+       { "ast",   0, -14400, "America/Thule"                 },
+       { "ast",   0, -14400, "America/Tortola"               },
+       { "ast",   0, -14400, "America/Virgin"                },
+       { "ast",   0, -14400, "Atlantic/Bermuda"              },
+       { "ast",   0, -14400, "Canada/Atlantic"               },
+       { "ast",   0,  10800, "Asia/Aden"                     },
+       { "ast",   0,  10800, "Asia/Baghdad"                  },
+       { "ast",   0,  10800, "Asia/Bahrain"                  },
+       { "ast",   0,  10800, "Asia/Kuwait"                   },
+       { "ast",   0,  10800, "Asia/Qatar"                    },
+       { "awt",   1, -10800, "America/Halifax"               },
+       { "awt",   1, -10800, "America/Glace_Bay"             },
+       { "awt",   1, -10800, "America/Pangnirtung"           },
+       { "awt",   1, -10800, "America/Puerto_Rico"           },
+       { "awt",   1, -10800, "Canada/Atlantic"               },
+       { "azomt", 1,      0, "Atlantic/Azores"               },
+       { "azost", 1,  -3600, "Atlantic/Azores"               },
+       { "azost", 1,      0, "Atlantic/Azores"               },
+       { "azot",  0,  -3600, "Atlantic/Azores"               },
+       { "azot",  0,  -7200, "Atlantic/Azores"               },
+       { "azst",  1,  14400, "Asia/Baku"                     },
+       { "azst",  1,  18000, "Asia/Baku"                     },
+       { "azt",   0,  10800, "Asia/Baku"                     },
+       { "azt",   0,  14400, "Asia/Baku"                     },
+       { "bakst", 1,  14400, "Asia/Baku"                     },
+       { "bakst", 1,  18000, "Asia/Baku"                     },
+       { "bakt",  0,  10800, "Asia/Baku"                     },
+       { "bakt",  0,  14400, "Asia/Baku"                     },
+       { "bdst",  1,   7200, "Europe/London"                 },
+       { "bdst",  1,   7200, "Europe/Belfast"                },
+       { "bdst",  1,   7200, "Europe/Gibraltar"              },
+       { "bdst",  1,   7200, "GB"                            },
+       { "bdst",  1,   7200, "GB-Eire"                       },
+       { "bdst",  1,   7200, "WET"                           },
+       { "bdt",   1, -36000, "America/Adak"                  },
+       { "bdt",   1, -36000, "America/Atka"                  },
+       { "bdt",   1, -36000, "America/Nome"                  },
+       { "bdt",   1, -36000, "US/Aleutian"                   },
+       { "bdt",   0,  21600, "Asia/Dacca"                    },
+       { "bdt",   0,  21600, "Asia/Dhaka"                    },
+       { "beat",  0,   9000, "Africa/Mogadishu"              },
+       { "beat",  0,   9000, "Africa/Kampala"                },
+       { "beat",  0,   9000, "Africa/Nairobi"                },
+       { "beaut", 0,   9885, "Africa/Nairobi"                },
+       { "beaut", 0,   9885, "Africa/Dar_es_Salaam"          },
+       { "beaut", 0,   9885, "Africa/Kampala"                },
+       { "bmt",   0, -14308, "America/Barbados"              },
+       { "bmt",   0,  -3996, "Africa/Banjul"                 },
+       { "bmt",   0,   6264, "Europe/Tiraspol"               },
+       { "bmt",   0,   6264, "Europe/Chisinau"               },
+       { "bnt",   0,  27000, "Asia/Brunei"                   },
+       { "bnt",   0,  28800, "Asia/Brunei"                   },
+       { "bortst", 1,  30000, "Asia/Kuching"                  },
+       { "bort",  0,  27000, "Asia/Kuching"                  },
+       { "bort",  0,  28800, "Asia/Kuching"                  },
+       { "bost",  1, -12756, "America/La_Paz"                },
+       { "bot",   0, -14400, "America/La_Paz"                },
+       { "brst",  1,  -7200, "America/Sao_Paulo"             },
+       { "brst",  1,  -7200, "America/Araguaina"             },
+       { "brst",  1,  -7200, "America/Bahia"                 },
+       { "brst",  1,  -7200, "America/Belem"                 },
+       { "brst",  1,  -7200, "America/Fortaleza"             },
+       { "brst",  1,  -7200, "America/Maceio"                },
+       { "brst",  1,  -7200, "America/Recife"                },
+       { "brst",  1,  -7200, "Brazil/East"                   },
+       { "brt",   0, -10800, "America/Sao_Paulo"             },
+       { "brt",   0, -10800, "America/Araguaina"             },
+       { "brt",   0, -10800, "America/Bahia"                 },
+       { "brt",   0, -10800, "America/Belem"                 },
+       { "brt",   0, -10800, "America/Fortaleza"             },
+       { "brt",   0, -10800, "America/Maceio"                },
+       { "brt",   0, -10800, "America/Recife"                },
+       { "brt",   0, -10800, "Brazil/East"                   },
+       { "bst",   0,   3600, "Europe/London"                 },
+       { "bst",   1,   3600, "Europe/London"                 },
+       { "bst",   0, -39600, "America/Adak"                  },
+       { "bst",   0, -39600, "America/Atka"                  },
+       { "bst",   0, -39600, "America/Nome"                  },
+       { "bst",   0, -39600, "Pacific/Midway"                },
+       { "bst",   0, -39600, "Pacific/Pago_Pago"             },
+       { "bst",   0, -39600, "Pacific/Samoa"                 },
+       { "bst",   0, -39600, "US/Aleutian"                   },
+       { "bst",   0, -39600, "US/Samoa"                      },
+       { "bst",   0,   3600, "Europe/Belfast"                },
+       { "bst",   0,   3600, "GB"                            },
+       { "bst",   0,   3600, "GB-Eire"                       },
+       { "bst",   0,   3600, "WET"                           },
+       { "bst",   1,   3600, "Eire"                          },
+       { "bst",   1,   3600, "Europe/Belfast"                },
+       { "bst",   1,   3600, "Europe/Dublin"                 },
+       { "bst",   1,   3600, "Europe/Gibraltar"              },
+       { "bst",   1,   3600, "GB"                            },
+       { "bst",   1,   3600, "GB-Eire"                       },
+       { "bst",   1,   3600, "WET"                           },
+       { "btt",   0,  21600, "Asia/Thimbu"                   },
+       { "btt",   0,  21600, "Asia/Thimphu"                  },
+       { "burt",  0,  23400, "Asia/Calcutta"                 },
+       { "burt",  0,  23400, "Asia/Dacca"                    },
+       { "burt",  0,  23400, "Asia/Dhaka"                    },
+       { "burt",  0,  23400, "Asia/Rangoon"                  },
+       { "cant",  0,  -3600, "Atlantic/Canary"               },
+       { "cast",  0,  34200, "Australia/Adelaide"            },
+       { "cast",  1,  10800, "Africa/Gaborone"               },
+       { "cast",  1,  10800, "Africa/Khartoum"               },
+       { "cat",   0, -36000, "America/Anchorage"             },
+       { "cat",   0, -36000, "US/Alaska"                     },
+       { "cat",   0,   7200, "Africa/Khartoum"               },
+       { "cat",   0,   7200, "Africa/Blantyre"               },
+       { "cat",   0,   7200, "Africa/Gaborone"               },
+       { "cat",   0,   7200, "Africa/Harare"                 },
+       { "cat",   0,   7200, "Africa/Kigali"                 },
+       { "cat",   0,   7200, "Africa/Lusaka"                 },
+       { "cat",   0,   7200, "Africa/Maputo"                 },
+       { "cat",   0,   7200, "Africa/Windhoek"               },
+       { "cawt",  1, -32400, "America/Anchorage"             },
+       { "cawt",  1, -32400, "US/Alaska"                     },
+       { "cddt",  1, -14400, "America/Rankin_Inlet"          },
+       { "cdt",   1, -18000, "America/Chicago"               },
+       { "cdt",   1, -14400, "America/Havana"                },
+       { "cdt",   1, -14400, "Cuba"                          },
+       { "cdt",   1, -18000, "America/Belize"                },
+       { "cdt",   1, -18000, "America/Cambridge_Bay"         },
+       { "cdt",   1, -18000, "America/Cancun"                },
+       { "cdt",   1, -18000, "America/Chihuahua"             },
+       { "cdt",   1, -18000, "America/Costa_Rica"            },
+       { "cdt",   1, -18000, "America/El_Salvador"           },
+       { "cdt",   1, -18000, "America/Fort_Wayne"            },
+       { "cdt",   1, -18000, "America/Guatemala"             },
+       { "cdt",   1, -18000, "America/Indiana/Indianapolis"  },
+       { "cdt",   1, -18000, "America/Indiana/Knox"          },
+       { "cdt",   1, -18000, "America/Indiana/Marengo"       },
+       { "cdt",   1, -18000, "America/Indiana/Vevay"         },
+       { "cdt",   1, -18000, "America/Indianapolis"          },
+       { "cdt",   1, -18000, "America/Iqaluit"               },
+       { "cdt",   1, -18000, "America/Kentucky/Louisville"   },
+       { "cdt",   1, -18000, "America/Kentucky/Monticello"   },
+       { "cdt",   1, -18000, "America/Knox_IN"               },
+       { "cdt",   1, -18000, "America/Louisville"            },
+       { "cdt",   1, -18000, "America/Managua"               },
+       { "cdt",   1, -18000, "America/Menominee"             },
+       { "cdt",   1, -18000, "America/Merida"                },
+       { "cdt",   1, -18000, "America/Mexico_City"           },
+       { "cdt",   1, -18000, "America/Monterrey"             },
+       { "cdt",   1, -18000, "America/North_Dakota/Center"   },
+       { "cdt",   1, -18000, "America/Pangnirtung"           },
+       { "cdt",   1, -18000, "America/Rainy_River"           },
+       { "cdt",   1, -18000, "America/Rankin_Inlet"          },
+       { "cdt",   1, -18000, "America/Tegucigalpa"           },
+       { "cdt",   1, -18000, "America/Winnipeg"              },
+       { "cdt",   1, -18000, "Canada/Central"                },
+       { "cdt",   1, -18000, "CST6CDT"                       },
+       { "cdt",   1, -18000, "Mexico/General"                },
+       { "cdt",   1, -18000, "US/Central"                    },
+       { "cdt",   1, -18000, "US/East-Indiana"               },
+       { "cdt",   1, -18000, "US/Indiana-Starke"             },
+       { "cdt",   1,  32400, "Asia/Shanghai"                 },
+       { "cdt",   1,  32400, "Asia/Chongqing"                },
+       { "cdt",   1,  32400, "Asia/Chungking"                },
+       { "cdt",   1,  32400, "Asia/Harbin"                   },
+       { "cdt",   1,  32400, "Asia/Kashgar"                  },
+       { "cdt",   1,  32400, "Asia/Taipei"                   },
+       { "cdt",   1,  32400, "Asia/Urumqi"                   },
+       { "cdt",   1,  32400, "PRC"                           },
+       { "cdt",   1,  32400, "ROC"                           },
+       { "cemt",  1,  10800, "Europe/Berlin"                 },
+       { "cemt",  1,  10800, "CET"                           },
+       { "cest",  1,   7200, "Europe/Berlin"                 },
+       { "cest",  1,  10800, "Europe/Kaliningrad"            },
+       { "cest",  1,   7200, "Africa/Algiers"                },
+       { "cest",  1,   7200, "Africa/Ceuta"                  },
+       { "cest",  1,   7200, "Africa/Tripoli"                },
+       { "cest",  1,   7200, "Africa/Tunis"                  },
+       { "cest",  1,   7200, "Arctic/Longyearbyen"           },
+       { "cest",  1,   7200, "Atlantic/Jan_Mayen"            },
+       { "cest",  1,   7200, "CET"                           },
+       { "cest",  1,   7200, "Europe/Amsterdam"              },
+       { "cest",  1,   7200, "Europe/Andorra"                },
+       { "cest",  1,   7200, "Europe/Athens"                 },
+       { "cest",  1,   7200, "Europe/Belgrade"               },
+       { "cest",  1,   7200, "Europe/Bratislava"             },
+       { "cest",  1,   7200, "Europe/Brussels"               },
+       { "cest",  1,   7200, "Europe/Budapest"               },
+       { "cest",  1,   7200, "Europe/Chisinau"               },
+       { "cest",  1,   7200, "Europe/Copenhagen"             },
+       { "cest",  1,   7200, "Europe/Gibraltar"              },
+       { "cest",  1,   7200, "Europe/Kaliningrad"            },
+       { "cest",  1,   7200, "Europe/Kiev"                   },
+       { "cest",  1,   7200, "Europe/Lisbon"                 },
+       { "cest",  1,   7200, "Europe/Ljubljana"              },
+       { "cest",  1,   7200, "Europe/Luxembourg"             },
+       { "cest",  1,   7200, "Europe/Madrid"                 },
+       { "cest",  1,   7200, "Europe/Malta"                  },
+       { "cest",  1,   7200, "Europe/Minsk"                  },
+       { "cest",  1,   7200, "Europe/Monaco"                 },
+       { "cest",  1,   7200, "Europe/Oslo"                   },
+       { "cest",  1,   7200, "Europe/Paris"                  },
+       { "cest",  1,   7200, "Europe/Prague"                 },
+       { "cest",  1,   7200, "Europe/Riga"                   },
+       { "cest",  1,   7200, "Europe/Rome"                   },
+       { "cest",  1,   7200, "Europe/San_Marino"             },
+       { "cest",  1,   7200, "Europe/Sarajevo"               },
+       { "cest",  1,   7200, "Europe/Simferopol"             },
+       { "cest",  1,   7200, "Europe/Skopje"                 },
+       { "cest",  1,   7200, "Europe/Sofia"                  },
+       { "cest",  1,   7200, "Europe/Stockholm"              },
+       { "cest",  1,   7200, "Europe/Tallinn"                },
+       { "cest",  1,   7200, "Europe/Tirane"                 },
+       { "cest",  1,   7200, "Europe/Tiraspol"               },
+       { "cest",  1,   7200, "Europe/Uzhgorod"               },
+       { "cest",  1,   7200, "Europe/Vaduz"                  },
+       { "cest",  1,   7200, "Europe/Vatican"                },
+       { "cest",  1,   7200, "Europe/Vienna"                 },
+       { "cest",  1,   7200, "Europe/Vilnius"                },
+       { "cest",  1,   7200, "Europe/Warsaw"                 },
+       { "cest",  1,   7200, "Europe/Zagreb"                 },
+       { "cest",  1,   7200, "Europe/Zaporozhye"             },
+       { "cest",  1,   7200, "Europe/Zurich"                 },
+       { "cest",  1,   7200, "Libya"                         },
+       { "cest",  1,   7200, "Poland"                        },
+       { "cest",  1,   7200, "Portugal"                      },
+       { "cet",   0,   3600, "Europe/Berlin"                 },
+       { "cet",   0,   3600, "Africa/Algiers"                },
+       { "cet",   0,   3600, "Africa/Casablanca"             },
+       { "cet",   0,   3600, "Africa/Ceuta"                  },
+       { "cet",   0,   3600, "Africa/Tripoli"                },
+       { "cet",   0,   3600, "Africa/Tunis"                  },
+       { "cet",   0,   3600, "Arctic/Longyearbyen"           },
+       { "cet",   0,   3600, "Atlantic/Jan_Mayen"            },
+       { "cet",   0,   3600, "CET"                           },
+       { "cet",   0,   3600, "Europe/Amsterdam"              },
+       { "cet",   0,   3600, "Europe/Andorra"                },
+       { "cet",   0,   3600, "Europe/Athens"                 },
+       { "cet",   0,   3600, "Europe/Belgrade"               },
+       { "cet",   0,   3600, "Europe/Bratislava"             },
+       { "cet",   0,   3600, "Europe/Brussels"               },
+       { "cet",   0,   3600, "Europe/Budapest"               },
+       { "cet",   0,   3600, "Europe/Chisinau"               },
+       { "cet",   0,   3600, "Europe/Copenhagen"             },
+       { "cet",   0,   3600, "Europe/Gibraltar"              },
+       { "cet",   0,   3600, "Europe/Kaliningrad"            },
+       { "cet",   0,   3600, "Europe/Kiev"                   },
+       { "cet",   0,   3600, "Europe/Lisbon"                 },
+       { "cet",   0,   3600, "Europe/Ljubljana"              },
+       { "cet",   0,   3600, "Europe/Luxembourg"             },
+       { "cet",   0,   3600, "Europe/Madrid"                 },
+       { "cet",   0,   3600, "Europe/Malta"                  },
+       { "cet",   0,   3600, "Europe/Minsk"                  },
+       { "cet",   0,   3600, "Europe/Monaco"                 },
+       { "cet",   0,   3600, "Europe/Oslo"                   },
+       { "cet",   0,   3600, "Europe/Paris"                  },
+       { "cet",   0,   3600, "Europe/Prague"                 },
+       { "cet",   0,   3600, "Europe/Riga"                   },
+       { "cet",   0,   3600, "Europe/Rome"                   },
+       { "cet",   0,   3600, "Europe/San_Marino"             },
+       { "cet",   0,   3600, "Europe/Sarajevo"               },
+       { "cet",   0,   3600, "Europe/Simferopol"             },
+       { "cet",   0,   3600, "Europe/Skopje"                 },
+       { "cet",   0,   3600, "Europe/Sofia"                  },
+       { "cet",   0,   3600, "Europe/Stockholm"              },
+       { "cet",   0,   3600, "Europe/Tallinn"                },
+       { "cet",   0,   3600, "Europe/Tirane"                 },
+       { "cet",   0,   3600, "Europe/Tiraspol"               },
+       { "cet",   0,   3600, "Europe/Uzhgorod"               },
+       { "cet",   0,   3600, "Europe/Vaduz"                  },
+       { "cet",   0,   3600, "Europe/Vatican"                },
+       { "cet",   0,   3600, "Europe/Vienna"                 },
+       { "cet",   0,   3600, "Europe/Vilnius"                },
+       { "cet",   0,   3600, "Europe/Warsaw"                 },
+       { "cet",   0,   3600, "Europe/Zagreb"                 },
+       { "cet",   0,   3600, "Europe/Zaporozhye"             },
+       { "cet",   0,   3600, "Europe/Zurich"                 },
+       { "cet",   0,   3600, "Libya"                         },
+       { "cet",   0,   3600, "Poland"                        },
+       { "cet",   0,   3600, "Portugal"                      },
+       { "cet",   0,   7200, "Europe/Kaliningrad"            },
+       { "cgst",  1,  -3600, "America/Scoresbysund"          },
+       { "cgt",   0,  -7200, "America/Scoresbysund"          },
+       { "chadt", 1,  49500, "Pacific/Chatham"               },
+       { "chadt", 1,  49500, "NZ-CHAT"                       },
+       { "chast", 0,  45900, "Pacific/Chatham"               },
+       { "chast", 0,  45900, "NZ-CHAT"                       },
+       { "chat",  0,  30600, "Asia/Harbin"                   },
+       { "chat",  0,  32400, "Asia/Harbin"                   },
+       { "chdt",  1, -19800, "America/Belize"                },
+       { "chost", 1,  36000, "Asia/Choibalsan"               },
+       { "chot",  0,  32400, "Asia/Choibalsan"               },
+       { "cit",   0,  28800, "Asia/Dili"                     },
+       { "cit",   0,  28800, "Asia/Makassar"                 },
+       { "cit",   0,  28800, "Asia/Pontianak"                },
+       { "cit",   0,  28800, "Asia/Ujung_Pandang"            },
+       { "cjt",   0,  32400, "Asia/Sakhalin"                 },
+       { "ckhst", 1, -34200, "Pacific/Rarotonga"             },
+       { "ckt",   0, -36000, "Pacific/Rarotonga"             },
+       { "clst",  1, -10800, "America/Santiago"              },
+       { "clst",  1, -14400, "America/Santiago"              },
+       { "clst",  1, -10800, "Antarctica/Palmer"             },
+       { "clst",  1, -10800, "Chile/Continental"             },
+       { "clst",  1, -14400, "Chile/Continental"             },
+       { "clt",   0, -14400, "America/Santiago"              },
+       { "clt",   0, -18000, "America/Santiago"              },
+       { "clt",   0, -14400, "Antarctica/Palmer"             },
+       { "clt",   0, -14400, "Chile/Continental"             },
+       { "clt",   0, -18000, "Chile/Continental"             },
+       { "cost",  1, -14400, "America/Bogota"                },
+       { "cot",   0, -18000, "America/Bogota"                },
+       { "cpt",   1, -18000, "America/Chicago"               },
+       { "cpt",   1, -18000, "America/Fort_Wayne"            },
+       { "cpt",   1, -18000, "America/Indiana/Indianapolis"  },
+       { "cpt",   1, -18000, "America/Indiana/Knox"          },
+       { "cpt",   1, -18000, "America/Indiana/Marengo"       },
+       { "cpt",   1, -18000, "America/Indiana/Vevay"         },
+       { "cpt",   1, -18000, "America/Indianapolis"          },
+       { "cpt",   1, -18000, "America/Kentucky/Louisville"   },
+       { "cpt",   1, -18000, "America/Kentucky/Monticello"   },
+       { "cpt",   1, -18000, "America/Knox_IN"               },
+       { "cpt",   1, -18000, "America/Louisville"            },
+       { "cpt",   1, -18000, "America/Menominee"             },
+       { "cpt",   1, -18000, "America/Rainy_River"           },
+       { "cpt",   1, -18000, "America/Rankin_Inlet"          },
+       { "cpt",   1, -18000, "America/Winnipeg"              },
+       { "cpt",   1, -18000, "Canada/Central"                },
+       { "cpt",   1, -18000, "CST6CDT"                       },
+       { "cpt",   1, -18000, "US/Central"                    },
+       { "cpt",   1, -18000, "US/East-Indiana"               },
+       { "cpt",   1, -18000, "US/Indiana-Starke"             },
+       { "cst",   0, -21600, "America/Chicago"               },
+       { "cst",   0, -18000, "America/Havana"                },
+       { "cst",   0, -18000, "Cuba"                          },
+       { "cst",   0, -21600, "America/Belize"                },
+       { "cst",   0, -21600, "America/Cambridge_Bay"         },
+       { "cst",   0, -21600, "America/Cancun"                },
+       { "cst",   0, -21600, "America/Chihuahua"             },
+       { "cst",   0, -21600, "America/Costa_Rica"            },
+       { "cst",   0, -21600, "America/Detroit"               },
+       { "cst",   0, -21600, "America/El_Salvador"           },
+       { "cst",   0, -21600, "America/Fort_Wayne"            },
+       { "cst",   0, -21600, "America/Guatemala"             },
+       { "cst",   0, -21600, "America/Hermosillo"            },
+       { "cst",   0, -21600, "America/Indiana/Indianapolis"  },
+       { "cst",   0, -21600, "America/Indiana/Knox"          },
+       { "cst",   0, -21600, "America/Indiana/Marengo"       },
+       { "cst",   0, -21600, "America/Indiana/Vevay"         },
+       { "cst",   0, -21600, "America/Indianapolis"          },
+       { "cst",   0, -21600, "America/Iqaluit"               },
+       { "cst",   0, -21600, "America/Kentucky/Louisville"   },
+       { "cst",   0, -21600, "America/Kentucky/Monticello"   },
+       { "cst",   0, -21600, "America/Knox_IN"               },
+       { "cst",   0, -21600, "America/Louisville"            },
+       { "cst",   0, -21600, "America/Managua"               },
+       { "cst",   0, -21600, "America/Mazatlan"              },
+       { "cst",   0, -21600, "America/Menominee"             },
+       { "cst",   0, -21600, "America/Merida"                },
+       { "cst",   0, -21600, "America/Mexico_City"           },
+       { "cst",   0, -21600, "America/Monterrey"             },
+       { "cst",   0, -21600, "America/North_Dakota/Center"   },
+       { "cst",   0, -21600, "America/Pangnirtung"           },
+       { "cst",   0, -21600, "America/Rainy_River"           },
+       { "cst",   0, -21600, "America/Rankin_Inlet"          },
+       { "cst",   0, -21600, "America/Regina"                },
+       { "cst",   0, -21600, "America/Swift_Current"         },
+       { "cst",   0, -21600, "America/Tegucigalpa"           },
+       { "cst",   0, -21600, "America/Winnipeg"              },
+       { "cst",   0, -21600, "Canada/Central"                },
+       { "cst",   0, -21600, "Canada/East-Saskatchewan"      },
+       { "cst",   0, -21600, "Canada/Saskatchewan"           },
+       { "cst",   0, -21600, "CST6CDT"                       },
+       { "cst",   0, -21600, "Mexico/BajaSur"                },
+       { "cst",   0, -21600, "Mexico/General"                },
+       { "cst",   0, -21600, "US/Central"                    },
+       { "cst",   0, -21600, "US/East-Indiana"               },
+       { "cst",   0, -21600, "US/Indiana-Starke"             },
+       { "cst",   0, -21600, "US/Michigan"                   },
+       { "cst",   0,  28800, "Asia/Chongqing"                },
+       { "cst",   0,  28800, "Asia/Chungking"                },
+       { "cst",   0,  28800, "Asia/Harbin"                   },
+       { "cst",   0,  28800, "Asia/Kashgar"                  },
+       { "cst",   0,  28800, "Asia/Macao"                    },
+       { "cst",   0,  28800, "Asia/Macau"                    },
+       { "cst",   0,  28800, "Asia/Shanghai"                 },
+       { "cst",   0,  28800, "Asia/Taipei"                   },
+       { "cst",   0,  28800, "Asia/Urumqi"                   },
+       { "cst",   0,  28800, "PRC"                           },
+       { "cst",   0,  28800, "ROC"                           },
+       { "cst",   0,  34200, "Asia/Jayapura"                 },
+       { "cst",   0,  34200, "Australia/Adelaide"            },
+       { "cst",   0,  34200, "Australia/Broken_Hill"         },
+       { "cst",   0,  34200, "Australia/Darwin"              },
+       { "cst",   0,  34200, "Australia/North"               },
+       { "cst",   0,  34200, "Australia/South"               },
+       { "cst",   0,  34200, "Australia/Yancowinna"          },
+       { "cst",   1,  37800, "Australia/Adelaide"            },
+       { "cst",   1,  37800, "Australia/Broken_Hill"         },
+       { "cst",   1,  37800, "Australia/Darwin"              },
+       { "cst",   1,  37800, "Australia/North"               },
+       { "cst",   1,  37800, "Australia/South"               },
+       { "cst",   1,  37800, "Australia/Yancowinna"          },
+       { "cvst",  1,  -3600, "Atlantic/Cape_Verde"           },
+       { "cvt",   0,  -3600, "Atlantic/Cape_Verde"           },
+       { "cvt",   0,  -7200, "Atlantic/Cape_Verde"           },
+       { "cwt",   1, -18000, "America/Chicago"               },
+       { "cwt",   1, -18000, "America/Fort_Wayne"            },
+       { "cwt",   1, -18000, "America/Indiana/Indianapolis"  },
+       { "cwt",   1, -18000, "America/Indiana/Knox"          },
+       { "cwt",   1, -18000, "America/Indiana/Marengo"       },
+       { "cwt",   1, -18000, "America/Indiana/Vevay"         },
+       { "cwt",   1, -18000, "America/Indianapolis"          },
+       { "cwt",   1, -18000, "America/Kentucky/Louisville"   },
+       { "cwt",   1, -18000, "America/Kentucky/Monticello"   },
+       { "cwt",   1, -18000, "America/Knox_IN"               },
+       { "cwt",   1, -18000, "America/Louisville"            },
+       { "cwt",   1, -18000, "America/Menominee"             },
+       { "cwt",   1, -18000, "America/Mexico_City"           },
+       { "cwt",   1, -18000, "America/Rainy_River"           },
+       { "cwt",   1, -18000, "America/Rankin_Inlet"          },
+       { "cwt",   1, -18000, "America/Winnipeg"              },
+       { "cwt",   1, -18000, "Canada/Central"                },
+       { "cwt",   1, -18000, "CST6CDT"                       },
+       { "cwt",   1, -18000, "Mexico/General"                },
+       { "cwt",   1, -18000, "US/Central"                    },
+       { "cwt",   1, -18000, "US/East-Indiana"               },
+       { "cwt",   1, -18000, "US/Indiana-Starke"             },
+       { "chst",  0,  36000, "Pacific/Guam"                  },
+       { "chst",  0,  36000, "Pacific/Saipan"                },
+       { "dact",  0,  21600, "Asia/Dacca"                    },
+       { "dact",  0,  21600, "Asia/Dhaka"                    },
+       { "davt",  0,  25200, "Antarctica/Davis"              },
+       { "ddut",  0,  36000, "Antarctica/DumontDUrville"     },
+       { "dusst", 1,  21600, "Asia/Dushanbe"                 },
+       { "dusst", 1,  25200, "Asia/Dushanbe"                 },
+       { "dust",  0,  18000, "Asia/Dushanbe"                 },
+       { "dust",  0,  21600, "Asia/Dushanbe"                 },
+       { "easst", 1, -18000, "Chile/EasterIsland"            },
+       { "easst", 1, -21600, "Chile/EasterIsland"            },
+       { "easst", 1, -18000, "Pacific/Easter"                },
+       { "easst", 1, -21600, "Pacific/Easter"                },
+       { "east",  0, -21600, "Chile/EasterIsland"            },
+       { "east",  0, -25200, "Chile/EasterIsland"            },
+       { "east",  0, -21600, "Pacific/Easter"                },
+       { "east",  0, -25200, "Pacific/Easter"                },
+       { "east",  1,  14400, "Indian/Antananarivo"           },
+       { "eat",   0,  10800, "Africa/Khartoum"               },
+       { "eat",   0,  10800, "Africa/Addis_Ababa"            },
+       { "eat",   0,  10800, "Africa/Asmera"                 },
+       { "eat",   0,  10800, "Africa/Dar_es_Salaam"          },
+       { "eat",   0,  10800, "Africa/Djibouti"               },
+       { "eat",   0,  10800, "Africa/Kampala"                },
+       { "eat",   0,  10800, "Africa/Mogadishu"              },
+       { "eat",   0,  10800, "Africa/Nairobi"                },
+       { "eat",   0,  10800, "Indian/Antananarivo"           },
+       { "eat",   0,  10800, "Indian/Comoro"                 },
+       { "eat",   0,  10800, "Indian/Mayotte"                },
+       { "ect",   0, -18000, "America/Guayaquil"             },
+       { "ect",   0, -18000, "Pacific/Galapagos"             },
+       { "eddt",  1, -10800, "America/Iqaluit"               },
+       { "edt",   1, -14400, "America/New_York"              },
+       { "edt",   1, -14400, "America/Cancun"                },
+       { "edt",   1, -14400, "America/Coral_Harbour"         },
+       { "edt",   1, -14400, "America/Detroit"               },
+       { "edt",   1, -14400, "America/Fort_Wayne"            },
+       { "edt",   1, -14400, "America/Grand_Turk"            },
+       { "edt",   1, -14400, "America/Indiana/Indianapolis"  },
+       { "edt",   1, -14400, "America/Indiana/Knox"          },
+       { "edt",   1, -14400, "America/Indiana/Marengo"       },
+       { "edt",   1, -14400, "America/Indiana/Vevay"         },
+       { "edt",   1, -14400, "America/Indianapolis"          },
+       { "edt",   1, -14400, "America/Iqaluit"               },
+       { "edt",   1, -14400, "America/Jamaica"               },
+       { "edt",   1, -14400, "America/Kentucky/Louisville"   },
+       { "edt",   1, -14400, "America/Kentucky/Monticello"   },
+       { "edt",   1, -14400, "America/Knox_IN"               },
+       { "edt",   1, -14400, "America/Louisville"            },
+       { "edt",   1, -14400, "America/Montreal"              },
+       { "edt",   1, -14400, "America/Nassau"                },
+       { "edt",   1, -14400, "America/Nipigon"               },
+       { "edt",   1, -14400, "America/Pangnirtung"           },
+       { "edt",   1, -14400, "America/Port-au-Prince"        },
+       { "edt",   1, -14400, "America/Santo_Domingo"         },
+       { "edt",   1, -14400, "America/Thunder_Bay"           },
+       { "edt",   1, -14400, "America/Toronto"               },
+       { "edt",   1, -14400, "Canada/Eastern"                },
+       { "edt",   1, -14400, "EST"                           },
+       { "edt",   1, -14400, "EST5EDT"                       },
+       { "edt",   1, -14400, "Jamaica"                       },
+       { "edt",   1, -14400, "US/East-Indiana"               },
+       { "edt",   1, -14400, "US/Eastern"                    },
+       { "edt",   1, -14400, "US/Indiana-Starke"             },
+       { "edt",   1, -14400, "US/Michigan"                   },
+       { "eest",  1,  10800, "Europe/Helsinki"               },
+       { "eest",  1,  10800, "Africa/Cairo"                  },
+       { "eest",  1,  10800, "Asia/Amman"                    },
+       { "eest",  1,  10800, "Asia/Beirut"                   },
+       { "eest",  1,  10800, "Asia/Damascus"                 },
+       { "eest",  1,  10800, "Asia/Gaza"                     },
+       { "eest",  1,  10800, "Asia/Istanbul"                 },
+       { "eest",  1,  10800, "Asia/Nicosia"                  },
+       { "eest",  1,  10800, "EET"                           },
+       { "eest",  1,  10800, "Egypt"                         },
+       { "eest",  1,  10800, "Europe/Athens"                 },
+       { "eest",  1,  10800, "Europe/Bucharest"              },
+       { "eest",  1,  10800, "Europe/Chisinau"               },
+       { "eest",  1,  10800, "Europe/Istanbul"               },
+       { "eest",  1,  10800, "Europe/Kaliningrad"            },
+       { "eest",  1,  10800, "Europe/Kiev"                   },
+       { "eest",  1,  10800, "Europe/Mariehamn"              },
+       { "eest",  1,  10800, "Europe/Minsk"                  },
+       { "eest",  1,  10800, "Europe/Moscow"                 },
+       { "eest",  1,  10800, "Europe/Nicosia"                },
+       { "eest",  1,  10800, "Europe/Riga"                   },
+       { "eest",  1,  10800, "Europe/Simferopol"             },
+       { "eest",  1,  10800, "Europe/Sofia"                  },
+       { "eest",  1,  10800, "Europe/Tallinn"                },
+       { "eest",  1,  10800, "Europe/Tiraspol"               },
+       { "eest",  1,  10800, "Europe/Uzhgorod"               },
+       { "eest",  1,  10800, "Europe/Vilnius"                },
+       { "eest",  1,  10800, "Europe/Warsaw"                 },
+       { "eest",  1,  10800, "Europe/Zaporozhye"             },
+       { "eest",  1,  10800, "Poland"                        },
+       { "eest",  1,  10800, "Turkey"                        },
+       { "eest",  1,  10800, "W-SU"                          },
+       { "eet",   0,   7200, "Europe/Helsinki"               },
+       { "eet",   1,  10800, "Asia/Gaza"                     },
+       { "eet",   0,   7200, "Africa/Cairo"                  },
+       { "eet",   0,   7200, "Africa/Tripoli"                },
+       { "eet",   0,   7200, "Asia/Amman"                    },
+       { "eet",   0,   7200, "Asia/Beirut"                   },
+       { "eet",   0,   7200, "Asia/Damascus"                 },
+       { "eet",   0,   7200, "Asia/Gaza"                     },
+       { "eet",   0,   7200, "Asia/Istanbul"                 },
+       { "eet",   0,   7200, "Asia/Nicosia"                  },
+       { "eet",   0,   7200, "EET"                           },
+       { "eet",   0,   7200, "Egypt"                         },
+       { "eet",   0,   7200, "Europe/Athens"                 },
+       { "eet",   0,   7200, "Europe/Bucharest"              },
+       { "eet",   0,   7200, "Europe/Chisinau"               },
+       { "eet",   0,   7200, "Europe/Istanbul"               },
+       { "eet",   0,   7200, "Europe/Kaliningrad"            },
+       { "eet",   0,   7200, "Europe/Kiev"                   },
+       { "eet",   0,   7200, "Europe/Mariehamn"              },
+       { "eet",   0,   7200, "Europe/Minsk"                  },
+       { "eet",   0,   7200, "Europe/Moscow"                 },
+       { "eet",   0,   7200, "Europe/Nicosia"                },
+       { "eet",   0,   7200, "Europe/Riga"                   },
+       { "eet",   0,   7200, "Europe/Simferopol"             },
+       { "eet",   0,   7200, "Europe/Sofia"                  },
+       { "eet",   0,   7200, "Europe/Tallinn"                },
+       { "eet",   0,   7200, "Europe/Tiraspol"               },
+       { "eet",   0,   7200, "Europe/Uzhgorod"               },
+       { "eet",   0,   7200, "Europe/Vilnius"                },
+       { "eet",   0,   7200, "Europe/Warsaw"                 },
+       { "eet",   0,   7200, "Europe/Zaporozhye"             },
+       { "eet",   0,   7200, "Libya"                         },
+       { "eet",   0,   7200, "Poland"                        },
+       { "eet",   0,   7200, "Turkey"                        },
+       { "eet",   0,   7200, "W-SU"                          },
+       { "egst",  1,      0, "America/Scoresbysund"          },
+       { "egt",   0,  -3600, "America/Scoresbysund"          },
+       { "ehdt",  1, -16200, "America/Santo_Domingo"         },
+       { "eit",   0,  32400, "Asia/Jayapura"                 },
+       { "ept",   1, -14400, "America/New_York"              },
+       { "ept",   1, -14400, "America/Coral_Harbour"         },
+       { "ept",   1, -14400, "America/Detroit"               },
+       { "ept",   1, -14400, "America/Iqaluit"               },
+       { "ept",   1, -14400, "America/Montreal"              },
+       { "ept",   1, -14400, "America/Nipigon"               },
+       { "ept",   1, -14400, "America/Thunder_Bay"           },
+       { "ept",   1, -14400, "America/Toronto"               },
+       { "ept",   1, -14400, "Canada/Eastern"                },
+       { "ept",   1, -14400, "EST"                           },
+       { "ept",   1, -14400, "EST5EDT"                       },
+       { "ept",   1, -14400, "US/Eastern"                    },
+       { "ept",   1, -14400, "US/Michigan"                   },
+       { "est",   0, -18000, "America/New_York"              },
+       { "est",   0, -18000, "America/Antigua"               },
+       { "est",   0, -18000, "America/Cambridge_Bay"         },
+       { "est",   0, -18000, "America/Cancun"                },
+       { "est",   0, -18000, "America/Cayman"                },
+       { "est",   0, -18000, "America/Chicago"               },
+       { "est",   0, -18000, "America/Coral_Harbour"         },
+       { "est",   0, -18000, "America/Detroit"               },
+       { "est",   0, -18000, "America/Fort_Wayne"            },
+       { "est",   0, -18000, "America/Grand_Turk"            },
+       { "est",   0, -18000, "America/Indiana/Indianapolis"  },
+       { "est",   0, -18000, "America/Indiana/Knox"          },
+       { "est",   0, -18000, "America/Indiana/Marengo"       },
+       { "est",   0, -18000, "America/Indiana/Vevay"         },
+       { "est",   0, -18000, "America/Indianapolis"          },
+       { "est",   0, -18000, "America/Iqaluit"               },
+       { "est",   0, -18000, "America/Jamaica"               },
+       { "est",   0, -18000, "America/Kentucky/Louisville"   },
+       { "est",   0, -18000, "America/Kentucky/Monticello"   },
+       { "est",   0, -18000, "America/Knox_IN"               },
+       { "est",   0, -18000, "America/Louisville"            },
+       { "est",   0, -18000, "America/Managua"               },
+       { "est",   0, -18000, "America/Menominee"             },
+       { "est",   0, -18000, "America/Merida"                },
+       { "est",   0, -18000, "America/Montreal"              },
+       { "est",   0, -18000, "America/Nassau"                },
+       { "est",   0, -18000, "America/Nipigon"               },
+       { "est",   0, -18000, "America/Panama"                },
+       { "est",   0, -18000, "America/Pangnirtung"           },
+       { "est",   0, -18000, "America/Port-au-Prince"        },
+       { "est",   0, -18000, "America/Rankin_Inlet"          },
+       { "est",   0, -18000, "America/Santo_Domingo"         },
+       { "est",   0, -18000, "America/Thunder_Bay"           },
+       { "est",   0, -18000, "America/Toronto"               },
+       { "est",   0, -18000, "Canada/Eastern"                },
+       { "est",   0, -18000, "CST6CDT"                       },
+       { "est",   0, -18000, "EST"                           },
+       { "est",   0, -18000, "EST5EDT"                       },
+       { "est",   0, -18000, "Jamaica"                       },
+       { "est",   0, -18000, "US/Central"                    },
+       { "est",   0, -18000, "US/East-Indiana"               },
+       { "est",   0, -18000, "US/Eastern"                    },
+       { "est",   0, -18000, "US/Indiana-Starke"             },
+       { "est",   0, -18000, "US/Michigan"                   },
+       { "est",   0,  36000, "Australia/ACT"                 },
+       { "est",   0,  36000, "Australia/Brisbane"            },
+       { "est",   0,  36000, "Australia/Canberra"            },
+       { "est",   0,  36000, "Australia/Currie"              },
+       { "est",   0,  36000, "Australia/Hobart"              },
+       { "est",   0,  36000, "Australia/Lindeman"            },
+       { "est",   0,  36000, "Australia/Melbourne"           },
+       { "est",   0,  36000, "Australia/NSW"                 },
+       { "est",   0,  36000, "Australia/Queensland"          },
+       { "est",   0,  36000, "Australia/Sydney"              },
+       { "est",   0,  36000, "Australia/Tasmania"            },
+       { "est",   0,  36000, "Australia/Victoria"            },
+       { "est",   1,  39600, "Australia/Melbourne"           },
+       { "est",   1,  39600, "Australia/ACT"                 },
+       { "est",   1,  39600, "Australia/Brisbane"            },
+       { "est",   1,  39600, "Australia/Canberra"            },
+       { "est",   1,  39600, "Australia/Currie"              },
+       { "est",   1,  39600, "Australia/Hobart"              },
+       { "est",   1,  39600, "Australia/Lindeman"            },
+       { "est",   1,  39600, "Australia/NSW"                 },
+       { "est",   1,  39600, "Australia/Queensland"          },
+       { "est",   1,  39600, "Australia/Sydney"              },
+       { "est",   1,  39600, "Australia/Tasmania"            },
+       { "est",   1,  39600, "Australia/Victoria"            },
+       { "ewt",   1, -14400, "America/New_York"              },
+       { "ewt",   1, -14400, "America/Coral_Harbour"         },
+       { "ewt",   1, -14400, "America/Detroit"               },
+       { "ewt",   1, -14400, "America/Iqaluit"               },
+       { "ewt",   1, -14400, "America/Montreal"              },
+       { "ewt",   1, -14400, "America/Nipigon"               },
+       { "ewt",   1, -14400, "America/Thunder_Bay"           },
+       { "ewt",   1, -14400, "America/Toronto"               },
+       { "ewt",   1, -14400, "Canada/Eastern"                },
+       { "ewt",   1, -14400, "EST"                           },
+       { "ewt",   1, -14400, "EST5EDT"                       },
+       { "ewt",   1, -14400, "US/Eastern"                    },
+       { "ewt",   1, -14400, "US/Michigan"                   },
+       { "fjst",  1,  46800, "Pacific/Fiji"                  },
+       { "fjt",   0,  43200, "Pacific/Fiji"                  },
+       { "fkst",  1, -10800, "Atlantic/Stanley"              },
+       { "fkst",  1,  -7200, "Atlantic/Stanley"              },
+       { "fkt",   0, -10800, "Atlantic/Stanley"              },
+       { "fkt",   0, -14400, "Atlantic/Stanley"              },
+       { "fnst",  1,  -3600, "America/Noronha"               },
+       { "fnst",  1,  -3600, "Brazil/DeNoronha"              },
+       { "fnt",   0,  -7200, "America/Noronha"               },
+       { "fnt",   0,  -7200, "Brazil/DeNoronha"              },
+       { "fort",  0,  14400, "Asia/Aqtau"                    },
+       { "fort",  0,  18000, "Asia/Aqtau"                    },
+       { "frust", 1,  21600, "Asia/Bishkek"                  },
+       { "frust", 1,  25200, "Asia/Bishkek"                  },
+       { "frut",  0,  18000, "Asia/Bishkek"                  },
+       { "frut",  0,  21600, "Asia/Bishkek"                  },
+       { "galt",  0, -21600, "Pacific/Galapagos"             },
+       { "gamt",  0, -32400, "Pacific/Gambier"               },
+       { "gbgt",  0, -13500, "America/Guyana"                },
+       { "gest",  1,  14400, "Asia/Tbilisi"                  },
+       { "gest",  1,  18000, "Asia/Tbilisi"                  },
+       { "get",   0,  10800, "Asia/Tbilisi"                  },
+       { "get",   0,  14400, "Asia/Tbilisi"                  },
+       { "gft",   0, -10800, "America/Cayenne"               },
+       { "gft",   0, -14400, "America/Cayenne"               },
+       { "ghst",  1,   1200, "Africa/Accra"                  },
+       { "gmt",   0,      0, "Africa/Abidjan"                },
+       { "gmt",   0,      0, "Africa/Accra"                  },
+       { "gmt",   0,      0, "Africa/Bamako"                 },
+       { "gmt",   0,      0, "Africa/Banjul"                 },
+       { "gmt",   0,      0, "Africa/Bissau"                 },
+       { "gmt",   0,      0, "Africa/Conakry"                },
+       { "gmt",   0,      0, "Africa/Dakar"                  },
+       { "gmt",   0,      0, "Africa/Freetown"               },
+       { "gmt",   0,      0, "Africa/Malabo"                 },
+       { "gmt",   0,      0, "Africa/Monrovia"               },
+       { "gmt",   0,      0, "Africa/Niamey"                 },
+       { "gmt",   0,      0, "Africa/Nouakchott"             },
+       { "gmt",   0,      0, "Africa/Ouagadougou"            },
+       { "gmt",   0,      0, "Africa/Porto-Novo"             },
+       { "gmt",   0,      0, "Africa/Sao_Tome"               },
+       { "gmt",   0,      0, "Africa/Timbuktu"               },
+       { "gmt",   0,      0, "America/Danmarkshavn"          },
+       { "gmt",   0,      0, "Atlantic/Reykjavik"            },
+       { "gmt",   0,      0, "Atlantic/St_Helena"            },
+       { "gmt",   0,      0, "Eire"                          },
+       { "gmt",   0,      0, "Europe/Belfast"                },
+       { "gmt",   0,      0, "Europe/Dublin"                 },
+       { "gmt",   0,      0, "Europe/Gibraltar"              },
+       { "gmt",   0,      0, "Europe/London"                 },
+       { "gmt",   0,      0, "GB"                            },
+       { "gmt",   0,      0, "GB-Eire"                       },
+       { "gmt",   0,      0, "Iceland"                       },
+       { "gmt",   0,      0, "WET"                           },
+       { "gst",   0,  14400, "Asia/Dubai"                    },
+       { "gst",   0,  14400, "Asia/Bahrain"                  },
+       { "gst",   0,  14400, "Asia/Muscat"                   },
+       { "gst",   0,  14400, "Asia/Qatar"                    },
+       { "gyt",   0, -10800, "America/Guyana"                },
+       { "gyt",   0, -13500, "America/Guyana"                },
+       { "gyt",   0, -14400, "America/Guyana"                },
+       { "hadt",  1, -32400, "America/Adak"                  },
+       { "hadt",  1, -32400, "America/Atka"                  },
+       { "hadt",  1, -32400, "US/Aleutian"                   },
+       { "hast",  0, -36000, "America/Adak"                  },
+       { "hast",  0, -36000, "America/Atka"                  },
+       { "hast",  0, -36000, "US/Aleutian"                   },
+       { "hdt",   1, -34200, "Pacific/Honolulu"              },
+       { "hdt",   1, -34200, "HST"                           },
+       { "hdt",   1, -34200, "US/Hawaii"                     },
+       { "hkst",  1,  32400, "Asia/Hong_Kong"                },
+       { "hkst",  1,  32400, "Hongkong"                      },
+       { "hkt",   0,  28800, "Asia/Hong_Kong"                },
+       { "hkt",   0,  28800, "Hongkong"                      },
+       { "hovst", 1,  28800, "Asia/Hovd"                     },
+       { "hovt",  0,  21600, "Asia/Hovd"                     },
+       { "hovt",  0,  25200, "Asia/Hovd"                     },
+       { "hpt",   1, -34200, "Pacific/Honolulu"              },
+       { "hpt",   1, -34200, "HST"                           },
+       { "hpt",   1, -34200, "US/Hawaii"                     },
+       { "hst",   0, -36000, "Pacific/Honolulu"              },
+       { "hst",   0, -37800, "Pacific/Honolulu"              },
+       { "hst",   0, -36000, "HST"                           },
+       { "hst",   0, -36000, "US/Hawaii"                     },
+       { "hst",   0, -37800, "HST"                           },
+       { "hst",   0, -37800, "US/Hawaii"                     },
+       { "hwt",   1, -34200, "Pacific/Honolulu"              },
+       { "hwt",   1, -34200, "HST"                           },
+       { "hwt",   1, -34200, "US/Hawaii"                     },
+       { "ict",   0,  25200, "Asia/Bangkok"                  },
+       { "ict",   0,  25200, "Asia/Phnom_Penh"               },
+       { "ict",   0,  25200, "Asia/Saigon"                   },
+       { "ict",   0,  25200, "Asia/Vientiane"                },
+       { "ict",   0,  28800, "Asia/Phnom_Penh"               },
+       { "ict",   0,  28800, "Asia/Saigon"                   },
+       { "ict",   0,  28800, "Asia/Vientiane"                },
+       { "iddt",  1,  14400, "Asia/Jerusalem"                },
+       { "iddt",  1,  14400, "Asia/Tel_Aviv"                 },
+       { "iddt",  1,  14400, "Israel"                        },
+       { "idt",   1,  10800, "Asia/Jerusalem"                },
+       { "idt",   1,  10800, "Asia/Gaza"                     },
+       { "idt",   1,  10800, "Asia/Tel_Aviv"                 },
+       { "idt",   1,  10800, "Israel"                        },
+       { "ihst",  1,  21600, "Asia/Colombo"                  },
+       { "iot",   0,  18000, "Indian/Chagos"                 },
+       { "iot",   0,  21600, "Indian/Chagos"                 },
+       { "irdt",  1,  16200, "Asia/Tehran"                   },
+       { "irdt",  1,  18000, "Asia/Tehran"                   },
+       { "irdt",  1,  16200, "Iran"                          },
+       { "irdt",  1,  18000, "Iran"                          },
+       { "irkst", 1,  28800, "Asia/Irkutsk"                  },
+       { "irkst", 1,  32400, "Asia/Irkutsk"                  },
+       { "irkt",  0,  25200, "Asia/Irkutsk"                  },
+       { "irkt",  0,  28800, "Asia/Irkutsk"                  },
+       { "irst",  0,  12600, "Asia/Tehran"                   },
+       { "irst",  0,  14400, "Asia/Tehran"                   },
+       { "irst",  0,  12600, "Iran"                          },
+       { "irst",  0,  14400, "Iran"                          },
+       { "isst",  1,      0, "Atlantic/Reykjavik"            },
+       { "isst",  1,      0, "Iceland"                       },
+       { "ist",   0,   7200, "Asia/Jerusalem"                },
+       { "ist",   0,  -3600, "Atlantic/Reykjavik"            },
+       { "ist",   0,  -3600, "Iceland"                       },
+       { "ist",   0,  19800, "Asia/Calcutta"                 },
+       { "ist",   0,  19800, "Asia/Colombo"                  },
+       { "ist",   0,  19800, "Asia/Dacca"                    },
+       { "ist",   0,  19800, "Asia/Dhaka"                    },
+       { "ist",   0,  19800, "Asia/Karachi"                  },
+       { "ist",   0,  19800, "Asia/Katmandu"                 },
+       { "ist",   0,  19800, "Asia/Thimbu"                   },
+       { "ist",   0,  19800, "Asia/Thimphu"                  },
+       { "ist",   1,   2079, "Eire"                          },
+       { "ist",   1,   2079, "Europe/Dublin"                 },
+       { "ist",   1,  23400, "Asia/Calcutta"                 },
+       { "ist",   1,  23400, "Asia/Colombo"                  },
+       { "ist",   1,  23400, "Asia/Karachi"                  },
+       { "ist",   0,   3600, "Eire"                          },
+       { "ist",   0,   3600, "Europe/Dublin"                 },
+       { "ist",   1,   3600, "Eire"                          },
+       { "ist",   1,   3600, "Europe/Dublin"                 },
+       { "ist",   0,   7200, "Asia/Gaza"                     },
+       { "ist",   0,   7200, "Asia/Tel_Aviv"                 },
+       { "ist",   0,   7200, "Israel"                        },
+       { "javt",  0,  26400, "Asia/Jakarta"                  },
+       { "jdt",   1,  36000, "Asia/Tokyo"                    },
+       { "jdt",   1,  36000, "Japan"                         },
+       { "jst",   0,  32400, "Asia/Tokyo"                    },
+       { "jst",   0,  32400, "Asia/Dili"                     },
+       { "jst",   0,  32400, "Asia/Jakarta"                  },
+       { "jst",   0,  32400, "Asia/Kuala_Lumpur"             },
+       { "jst",   0,  32400, "Asia/Kuching"                  },
+       { "jst",   0,  32400, "Asia/Makassar"                 },
+       { "jst",   0,  32400, "Asia/Manila"                   },
+       { "jst",   0,  32400, "Asia/Pontianak"                },
+       { "jst",   0,  32400, "Asia/Rangoon"                  },
+       { "jst",   0,  32400, "Asia/Sakhalin"                 },
+       { "jst",   0,  32400, "Asia/Singapore"                },
+       { "jst",   0,  32400, "Asia/Ujung_Pandang"            },
+       { "jst",   0,  32400, "Japan"                         },
+       { "jst",   0,  32400, "Pacific/Nauru"                 },
+       { "jst",   0,  32400, "Singapore"                     },
+       { "kart",  0,  18000, "Asia/Karachi"                  },
+       { "kast",  0,  18000, "Asia/Kashgar"                  },
+       { "kast",  0,  19800, "Asia/Kashgar"                  },
+       { "kdt",   1,  32400, "Asia/Seoul"                    },
+       { "kdt",   1,  36000, "Asia/Seoul"                    },
+       { "kdt",   1,  32400, "ROK"                           },
+       { "kdt",   1,  36000, "ROK"                           },
+       { "kgst",  1,  21600, "Asia/Bishkek"                  },
+       { "kgt",   0,  18000, "Asia/Bishkek"                  },
+       { "kizst", 1,  21600, "Asia/Qyzylorda"                },
+       { "kizt",  0,  14400, "Asia/Qyzylorda"                },
+       { "kizt",  0,  18000, "Asia/Qyzylorda"                },
+       { "kizt",  0,  21600, "Asia/Qyzylorda"                },
+       { "kmt",   0,   5736, "Europe/Vilnius"                },
+       { "kost",  0,  39600, "Pacific/Kosrae"                },
+       { "kost",  0,  43200, "Pacific/Kosrae"                },
+       { "krast", 1,  25200, "Asia/Krasnoyarsk"              },
+       { "krast", 1,  28800, "Asia/Krasnoyarsk"              },
+       { "krat",  0,  21600, "Asia/Krasnoyarsk"              },
+       { "krat",  0,  25200, "Asia/Krasnoyarsk"              },
+       { "kst",   0,  28800, "Asia/Seoul"                    },
+       { "kst",   0,  30600, "Asia/Seoul"                    },
+       { "kst",   0,  32400, "Asia/Seoul"                    },
+       { "kst",   0,  28800, "Asia/Pyongyang"                },
+       { "kst",   0,  28800, "ROK"                           },
+       { "kst",   0,  30600, "Asia/Pyongyang"                },
+       { "kst",   0,  30600, "ROK"                           },
+       { "kst",   0,  32400, "Asia/Pyongyang"                },
+       { "kst",   0,  32400, "ROK"                           },
+       { "kuyst", 1,  10800, "Europe/Samara"                 },
+       { "kuyst", 1,  14400, "Europe/Samara"                 },
+       { "kuyst", 1,  18000, "Europe/Samara"                 },
+       { "kuyt",  0,  10800, "Europe/Samara"                 },
+       { "kuyt",  0,  14400, "Europe/Samara"                 },
+       { "kwat",  0, -43200, "Pacific/Kwajalein"             },
+       { "kwat",  0, -43200, "Kwajalein"                     },
+       { "lhst",  0,  37800, "Australia/Lord_Howe"           },
+       { "lhst",  1,  39600, "Australia/Lord_Howe"           },
+       { "lhst",  1,  41400, "Australia/Lord_Howe"           },
+       { "lhst",  0,  37800, "Australia/LHI"                 },
+       { "lhst",  1,  39600, "Australia/LHI"                 },
+       { "lhst",  1,  41400, "Australia/LHI"                 },
+       { "lint",  0, -36000, "Pacific/Kiritimati"            },
+       { "lint",  0,  50400, "Pacific/Kiritimati"            },
+       { "lkt",   0,  21600, "Asia/Colombo"                  },
+       { "lkt",   0,  23400, "Asia/Colombo"                  },
+       { "lont",  0,  25200, "Asia/Chongqing"                },
+       { "lont",  0,  25200, "Asia/Chungking"                },
+       { "lrt",   0,  -2670, "Africa/Monrovia"               },
+       { "lst",   1,   9384, "Europe/Riga"                   },
+       { "madmt", 1,   3600, "Atlantic/Madeira"              },
+       { "madst", 1,      0, "Atlantic/Madeira"              },
+       { "madt",  0,  -3600, "Atlantic/Madeira"              },
+       { "magst", 1,  39600, "Asia/Magadan"                  },
+       { "magst", 1,  43200, "Asia/Magadan"                  },
+       { "magt",  0,  36000, "Asia/Magadan"                  },
+       { "magt",  0,  39600, "Asia/Magadan"                  },
+       { "malst", 1,  26400, "Asia/Singapore"                },
+       { "malst", 1,  26400, "Asia/Kuala_Lumpur"             },
+       { "malst", 1,  26400, "Singapore"                     },
+       { "malt",  0,  25200, "Asia/Singapore"                },
+       { "malt",  0,  26400, "Asia/Singapore"                },
+       { "malt",  0,  27000, "Asia/Singapore"                },
+       { "malt",  0,  25200, "Asia/Kuala_Lumpur"             },
+       { "malt",  0,  25200, "Singapore"                     },
+       { "malt",  0,  26400, "Asia/Kuala_Lumpur"             },
+       { "malt",  0,  26400, "Singapore"                     },
+       { "malt",  0,  27000, "Asia/Kuala_Lumpur"             },
+       { "malt",  0,  27000, "Singapore"                     },
+       { "mart",  0, -34200, "Pacific/Marquesas"             },
+       { "mawt",  0,  21600, "Antarctica/Mawson"             },
+       { "mddt",  1, -18000, "America/Cambridge_Bay"         },
+       { "mddt",  1, -18000, "America/Yellowknife"           },
+       { "mdst",  1,  16248, "Europe/Moscow"                 },
+       { "mdst",  1,  16248, "W-SU"                          },
+       { "mdt",   1, -21600, "America/Denver"                },
+       { "mdt",   1, -21600, "America/Boise"                 },
+       { "mdt",   1, -21600, "America/Cambridge_Bay"         },
+       { "mdt",   1, -21600, "America/Chihuahua"             },
+       { "mdt",   1, -21600, "America/Edmonton"              },
+       { "mdt",   1, -21600, "America/Hermosillo"            },
+       { "mdt",   1, -21600, "America/Inuvik"                },
+       { "mdt",   1, -21600, "America/Mazatlan"              },
+       { "mdt",   1, -21600, "America/North_Dakota/Center"   },
+       { "mdt",   1, -21600, "America/Phoenix"               },
+       { "mdt",   1, -21600, "America/Regina"                },
+       { "mdt",   1, -21600, "America/Shiprock"              },
+       { "mdt",   1, -21600, "America/Swift_Current"         },
+       { "mdt",   1, -21600, "America/Yellowknife"           },
+       { "mdt",   1, -21600, "Canada/East-Saskatchewan"      },
+       { "mdt",   1, -21600, "Canada/Mountain"               },
+       { "mdt",   1, -21600, "Canada/Saskatchewan"           },
+       { "mdt",   1, -21600, "Mexico/BajaSur"                },
+       { "mdt",   1, -21600, "MST"                           },
+       { "mdt",   1, -21600, "MST7MDT"                       },
+       { "mdt",   1, -21600, "Navajo"                        },
+       { "mdt",   1, -21600, "US/Arizona"                    },
+       { "mdt",   1, -21600, "US/Mountain"                   },
+       { "mest",  1,   7200, "MET"                           },
+       { "met",   0,   3600, "MET"                           },
+       { "mht",   0,  43200, "Pacific/Kwajalein"             },
+       { "mht",   0,  43200, "Kwajalein"                     },
+       { "mht",   0,  43200, "Pacific/Majuro"                },
+       { "mmt",   0,   9048, "Europe/Moscow"                 },
+       { "mmt",   0,  23400, "Asia/Rangoon"                  },
+       { "mmt",   0,  28656, "Asia/Makassar"                 },
+       { "mmt",   0,  28656, "Asia/Ujung_Pandang"            },
+       { "mmt",   0,   9048, "W-SU"                          },
+       { "most",  1,  32400, "Asia/Macao"                    },
+       { "most",  1,  32400, "Asia/Macau"                    },
+       { "mot",   0,  28800, "Asia/Macao"                    },
+       { "mot",   0,  28800, "Asia/Macau"                    },
+       { "mpt",   1, -21600, "America/Denver"                },
+       { "mpt",   1, -21600, "America/Boise"                 },
+       { "mpt",   1, -21600, "America/Cambridge_Bay"         },
+       { "mpt",   1, -21600, "America/Edmonton"              },
+       { "mpt",   1, -21600, "America/North_Dakota/Center"   },
+       { "mpt",   1, -21600, "America/Regina"                },
+       { "mpt",   1, -21600, "America/Shiprock"              },
+       { "mpt",   1, -21600, "America/Swift_Current"         },
+       { "mpt",   1, -21600, "America/Yellowknife"           },
+       { "mpt",   1, -21600, "Canada/East-Saskatchewan"      },
+       { "mpt",   1, -21600, "Canada/Mountain"               },
+       { "mpt",   1, -21600, "Canada/Saskatchewan"           },
+       { "mpt",   1, -21600, "MST7MDT"                       },
+       { "mpt",   1, -21600, "Navajo"                        },
+       { "mpt",   1, -21600, "US/Mountain"                   },
+       { "mpt",   0,  36000, "Pacific/Saipan"                },
+       { "msd",   1,  14400, "Europe/Moscow"                 },
+       { "msd",   1,  18000, "Europe/Moscow"                 },
+       { "msd",   1,  14400, "Europe/Chisinau"               },
+       { "msd",   1,  14400, "Europe/Kaliningrad"            },
+       { "msd",   1,  14400, "Europe/Kiev"                   },
+       { "msd",   1,  14400, "Europe/Minsk"                  },
+       { "msd",   1,  14400, "Europe/Riga"                   },
+       { "msd",   1,  14400, "Europe/Simferopol"             },
+       { "msd",   1,  14400, "Europe/Tallinn"                },
+       { "msd",   1,  14400, "Europe/Tiraspol"               },
+       { "msd",   1,  14400, "Europe/Uzhgorod"               },
+       { "msd",   1,  14400, "Europe/Vilnius"                },
+       { "msd",   1,  14400, "Europe/Zaporozhye"             },
+       { "msd",   1,  14400, "W-SU"                          },
+       { "msd",   1,  18000, "W-SU"                          },
+       { "msk",   0,  10800, "Europe/Moscow"                 },
+       { "msk",   0,  10800, "Europe/Chisinau"               },
+       { "msk",   0,  10800, "Europe/Kaliningrad"            },
+       { "msk",   0,  10800, "Europe/Kiev"                   },
+       { "msk",   0,  10800, "Europe/Minsk"                  },
+       { "msk",   0,  10800, "Europe/Riga"                   },
+       { "msk",   0,  10800, "Europe/Simferopol"             },
+       { "msk",   0,  10800, "Europe/Tallinn"                },
+       { "msk",   0,  10800, "Europe/Tiraspol"               },
+       { "msk",   0,  10800, "Europe/Uzhgorod"               },
+       { "msk",   0,  10800, "Europe/Vilnius"                },
+       { "msk",   0,  10800, "Europe/Zaporozhye"             },
+       { "msk",   0,  10800, "W-SU"                          },
+       { "mst",   0, -25200, "America/Denver"                },
+       { "mst",   0, -25200, "America/Boise"                 },
+       { "mst",   0, -25200, "America/Cambridge_Bay"         },
+       { "mst",   0, -25200, "America/Chihuahua"             },
+       { "mst",   0, -25200, "America/Dawson_Creek"          },
+       { "mst",   0, -25200, "America/Edmonton"              },
+       { "mst",   0, -25200, "America/Ensenada"              },
+       { "mst",   0, -25200, "America/Hermosillo"            },
+       { "mst",   0, -25200, "America/Inuvik"                },
+       { "mst",   0, -25200, "America/Mazatlan"              },
+       { "mst",   0, -25200, "America/Mexico_City"           },
+       { "mst",   0, -25200, "America/North_Dakota/Center"   },
+       { "mst",   0, -25200, "America/Phoenix"               },
+       { "mst",   0, -25200, "America/Regina"                },
+       { "mst",   0, -25200, "America/Shiprock"              },
+       { "mst",   0, -25200, "America/Swift_Current"         },
+       { "mst",   0, -25200, "America/Tijuana"               },
+       { "mst",   0, -25200, "America/Yellowknife"           },
+       { "mst",   0, -25200, "Canada/East-Saskatchewan"      },
+       { "mst",   0, -25200, "Canada/Mountain"               },
+       { "mst",   0, -25200, "Canada/Saskatchewan"           },
+       { "mst",   0, -25200, "Mexico/BajaNorte"              },
+       { "mst",   0, -25200, "Mexico/BajaSur"                },
+       { "mst",   0, -25200, "Mexico/General"                },
+       { "mst",   0, -25200, "MST"                           },
+       { "mst",   0, -25200, "MST7MDT"                       },
+       { "mst",   0, -25200, "Navajo"                        },
+       { "mst",   0, -25200, "US/Arizona"                    },
+       { "mst",   0, -25200, "US/Mountain"                   },
+       { "mst",   1,  12648, "Europe/Moscow"                 },
+       { "mst",   1,  12648, "W-SU"                          },
+       { "mut",   0,  14400, "Indian/Mauritius"              },
+       { "mvt",   0,  18000, "Indian/Maldives"               },
+       { "mwt",   1, -21600, "America/Denver"                },
+       { "mwt",   1, -21600, "America/Boise"                 },
+       { "mwt",   1, -21600, "America/Cambridge_Bay"         },
+       { "mwt",   1, -21600, "America/Edmonton"              },
+       { "mwt",   1, -21600, "America/North_Dakota/Center"   },
+       { "mwt",   1, -21600, "America/Phoenix"               },
+       { "mwt",   1, -21600, "America/Regina"                },
+       { "mwt",   1, -21600, "America/Shiprock"              },
+       { "mwt",   1, -21600, "America/Swift_Current"         },
+       { "mwt",   1, -21600, "America/Yellowknife"           },
+       { "mwt",   1, -21600, "Canada/East-Saskatchewan"      },
+       { "mwt",   1, -21600, "Canada/Mountain"               },
+       { "mwt",   1, -21600, "Canada/Saskatchewan"           },
+       { "mwt",   1, -21600, "MST"                           },
+       { "mwt",   1, -21600, "MST7MDT"                       },
+       { "mwt",   1, -21600, "Navajo"                        },
+       { "mwt",   1, -21600, "US/Arizona"                    },
+       { "mwt",   1, -21600, "US/Mountain"                   },
+       { "myt",   0,  28800, "Asia/Kuala_Lumpur"             },
+       { "myt",   0,  28800, "Asia/Kuching"                  },
+       { "ncst",  1,  43200, "Pacific/Noumea"                },
+       { "nct",   0,  39600, "Pacific/Noumea"                },
+       { "nddt",  1,  -5400, "America/St_Johns"              },
+       { "nddt",  1,  -5400, "Canada/Newfoundland"           },
+       { "ndt",   1,  -9000, "America/St_Johns"              },
+       { "ndt",   1,  -9052, "America/St_Johns"              },
+       { "ndt",   1, -36000, "Pacific/Midway"                },
+       { "ndt",   1,  -9000, "America/Goose_Bay"             },
+       { "ndt",   1,  -9000, "Canada/Newfoundland"           },
+       { "ndt",   1,  -9052, "America/Goose_Bay"             },
+       { "ndt",   1,  -9052, "Canada/Newfoundland"           },
+       { "negt",  0, -12600, "America/Paramaribo"            },
+       { "nest",  1,   4800, "Europe/Amsterdam"              },
+       { "net",   0,   1200, "Europe/Amsterdam"              },
+       { "nft",   0,  41400, "Pacific/Norfolk"               },
+       { "novst", 1,  25200, "Asia/Novosibirsk"              },
+       { "novst", 1,  28800, "Asia/Novosibirsk"              },
+       { "novt",  0,  21600, "Asia/Novosibirsk"              },
+       { "novt",  0,  25200, "Asia/Novosibirsk"              },
+       { "npt",   1,  -9000, "America/St_Johns"              },
+       { "npt",   1, -36000, "America/Adak"                  },
+       { "npt",   1, -36000, "America/Atka"                  },
+       { "npt",   1, -36000, "America/Nome"                  },
+       { "npt",   1, -36000, "US/Aleutian"                   },
+       { "npt",   1,  -9000, "America/Goose_Bay"             },
+       { "npt",   1,  -9000, "Canada/Newfoundland"           },
+       { "npt",   0,  20700, "Asia/Katmandu"                 },
+       { "nrt",   0,  41400, "Pacific/Nauru"                 },
+       { "nrt",   0,  43200, "Pacific/Nauru"                 },
+       { "nst",   0, -12600, "America/St_Johns"              },
+       { "nst",   0, -12652, "America/St_Johns"              },
+       { "nst",   0, -12600, "America/Goose_Bay"             },
+       { "nst",   0, -12600, "Canada/Newfoundland"           },
+       { "nst",   0, -12652, "America/Goose_Bay"             },
+       { "nst",   0, -12652, "Canada/Newfoundland"           },
+       { "nst",   0, -39600, "America/Adak"                  },
+       { "nst",   0, -39600, "America/Atka"                  },
+       { "nst",   0, -39600, "America/Nome"                  },
+       { "nst",   0, -39600, "Pacific/Midway"                },
+       { "nst",   0, -39600, "Pacific/Pago_Pago"             },
+       { "nst",   0, -39600, "Pacific/Samoa"                 },
+       { "nst",   0, -39600, "US/Aleutian"                   },
+       { "nst",   0, -39600, "US/Samoa"                      },
+       { "nst",   1,   4772, "Europe/Amsterdam"              },
+       { "nut",   0, -39600, "Pacific/Niue"                  },
+       { "nut",   0, -41400, "Pacific/Niue"                  },
+       { "nwt",   1,  -9000, "America/St_Johns"              },
+       { "nwt",   1, -36000, "America/Adak"                  },
+       { "nwt",   1, -36000, "America/Atka"                  },
+       { "nwt",   1, -36000, "America/Nome"                  },
+       { "nwt",   1, -36000, "US/Aleutian"                   },
+       { "nwt",   1,  -9000, "America/Goose_Bay"             },
+       { "nwt",   1,  -9000, "Canada/Newfoundland"           },
+       { "nzdt",  1,  46800, "Pacific/Auckland"              },
+       { "nzdt",  1,  46800, "Antarctica/McMurdo"            },
+       { "nzdt",  1,  46800, "Antarctica/South_Pole"         },
+       { "nzdt",  1,  46800, "NZ"                            },
+       { "nzmt",  0,  41400, "Pacific/Auckland"              },
+       { "nzmt",  0,  41400, "NZ"                            },
+       { "nzst",  0,  43200, "Pacific/Auckland"              },
+       { "nzst",  1,  43200, "Pacific/Auckland"              },
+       { "nzst",  1,  45000, "Pacific/Auckland"              },
+       { "nzst",  0,  43200, "Antarctica/McMurdo"            },
+       { "nzst",  0,  43200, "Antarctica/South_Pole"         },
+       { "nzst",  0,  43200, "NZ"                            },
+       { "nzst",  1,  43200, "NZ"                            },
+       { "nzst",  1,  45000, "NZ"                            },
+       { "omsst", 1,  21600, "Asia/Omsk"                     },
+       { "omsst", 1,  25200, "Asia/Omsk"                     },
+       { "omst",  0,  18000, "Asia/Omsk"                     },
+       { "omst",  0,  21600, "Asia/Omsk"                     },
+       { "orast", 1,  18000, "Asia/Oral"                     },
+       { "orat",  0,  14400, "Asia/Oral"                     },
+       { "orat",  0,  18000, "Asia/Oral"                     },
+       { "pddt",  1, -21600, "America/Inuvik"                },
+       { "pdt",   1, -25200, "America/Los_Angeles"           },
+       { "pdt",   1, -25200, "America/Boise"                 },
+       { "pdt",   1, -25200, "America/Dawson"                },
+       { "pdt",   1, -25200, "America/Dawson_Creek"          },
+       { "pdt",   1, -25200, "America/Ensenada"              },
+       { "pdt",   1, -25200, "America/Inuvik"                },
+       { "pdt",   1, -25200, "America/Juneau"                },
+       { "pdt",   1, -25200, "America/Tijuana"               },
+       { "pdt",   1, -25200, "America/Vancouver"             },
+       { "pdt",   1, -25200, "America/Whitehorse"            },
+       { "pdt",   1, -25200, "Canada/Pacific"                },
+       { "pdt",   1, -25200, "Canada/Yukon"                  },
+       { "pdt",   1, -25200, "Mexico/BajaNorte"              },
+       { "pdt",   1, -25200, "PST8PDT"                       },
+       { "pdt",   1, -25200, "US/Pacific"                    },
+       { "pdt",   1, -25200, "US/Pacific-New"                },
+       { "pest",  1, -14400, "America/Lima"                  },
+       { "petst", 1,  43200, "Asia/Kamchatka"                },
+       { "petst", 1,  46800, "Asia/Kamchatka"                },
+       { "pett",  0,  39600, "Asia/Kamchatka"                },
+       { "pett",  0,  43200, "Asia/Kamchatka"                },
+       { "pet",   0, -18000, "America/Lima"                  },
+       { "phot",  0, -39600, "Pacific/Enderbury"             },
+       { "phot",  0,  46800, "Pacific/Enderbury"             },
+       { "phst",  1,  32400, "Asia/Manila"                   },
+       { "pht",   0,  28800, "Asia/Manila"                   },
+       { "pkst",  1,  21600, "Asia/Karachi"                  },
+       { "pkt",   0,  18000, "Asia/Karachi"                  },
+       { "pmdt",  1,  -7200, "America/Miquelon"              },
+       { "pmst",  0, -10800, "America/Miquelon"              },
+       { "pmt",   0, -13236, "America/Paramaribo"            },
+       { "pmt",   0, -13252, "America/Paramaribo"            },
+       { "pmt",   0,  26240, "Asia/Pontianak"                },
+       { "pmt",   0,  36000, "Antarctica/DumontDUrville"     },
+       { "ppt",   1, -25200, "America/Los_Angeles"           },
+       { "ppt",   1, -25200, "America/Dawson_Creek"          },
+       { "ppt",   1, -25200, "America/Inuvik"                },
+       { "ppt",   1, -25200, "America/Juneau"                },
+       { "ppt",   1, -25200, "America/Vancouver"             },
+       { "ppt",   1, -25200, "Canada/Pacific"                },
+       { "ppt",   1, -25200, "PST8PDT"                       },
+       { "ppt",   1, -25200, "US/Pacific"                    },
+       { "ppt",   1, -25200, "US/Pacific-New"                },
+       { "pst",   0, -28800, "America/Los_Angeles"           },
+       { "pst",   0, -28800, "America/Boise"                 },
+       { "pst",   0, -28800, "America/Dawson"                },
+       { "pst",   0, -28800, "America/Dawson_Creek"          },
+       { "pst",   0, -28800, "America/Ensenada"              },
+       { "pst",   0, -28800, "America/Hermosillo"            },
+       { "pst",   0, -28800, "America/Inuvik"                },
+       { "pst",   0, -28800, "America/Juneau"                },
+       { "pst",   0, -28800, "America/Mazatlan"              },
+       { "pst",   0, -28800, "America/Tijuana"               },
+       { "pst",   0, -28800, "America/Vancouver"             },
+       { "pst",   0, -28800, "America/Whitehorse"            },
+       { "pst",   0, -28800, "Canada/Pacific"                },
+       { "pst",   0, -28800, "Canada/Yukon"                  },
+       { "pst",   0, -28800, "Mexico/BajaNorte"              },
+       { "pst",   0, -28800, "Mexico/BajaSur"                },
+       { "pst",   0, -28800, "Pacific/Pitcairn"              },
+       { "pst",   0, -28800, "PST8PDT"                       },
+       { "pst",   0, -28800, "US/Pacific"                    },
+       { "pst",   0, -28800, "US/Pacific-New"                },
+       { "pwt",   1, -25200, "America/Los_Angeles"           },
+       { "pwt",   1, -25200, "America/Dawson_Creek"          },
+       { "pwt",   1, -25200, "America/Ensenada"              },
+       { "pwt",   1, -25200, "America/Inuvik"                },
+       { "pwt",   1, -25200, "America/Juneau"                },
+       { "pwt",   1, -25200, "America/Tijuana"               },
+       { "pwt",   1, -25200, "America/Vancouver"             },
+       { "pwt",   1, -25200, "Canada/Pacific"                },
+       { "pwt",   1, -25200, "Mexico/BajaNorte"              },
+       { "pwt",   1, -25200, "PST8PDT"                       },
+       { "pwt",   1, -25200, "US/Pacific"                    },
+       { "pwt",   1, -25200, "US/Pacific-New"                },
+       { "pyst",  1, -10800, "America/Asuncion"              },
+       { "pyt",   0, -10800, "America/Asuncion"              },
+       { "pyt",   0, -14400, "America/Asuncion"              },
+       { "qyzst", 1,  25200, "Asia/Qyzylorda"                },
+       { "qyzt",  0,  18000, "Asia/Qyzylorda"                },
+       { "qyzt",  0,  21600, "Asia/Qyzylorda"                },
+       { "ret",   0,  14400, "Indian/Reunion"                },
+       { "rmt",   0,   5784, "Europe/Riga"                   },
+       { "rott",  0, -10800, "Antarctica/Rothera"            },
+       { "sakst", 1,  39600, "Asia/Sakhalin"                 },
+       { "sakst", 1,  43200, "Asia/Sakhalin"                 },
+       { "sakt",  0,  36000, "Asia/Sakhalin"                 },
+       { "sakt",  0,  39600, "Asia/Sakhalin"                 },
+       { "samst", 1,  21600, "Asia/Samarkand"                },
+       { "samst", 1,  18000, "Europe/Samara"                 },
+       { "samt",  0,  14400, "Asia/Samarkand"                },
+       { "samt",  0,  18000, "Asia/Samarkand"                },
+       { "samt",  0, -41400, "Pacific/Apia"                  },
+       { "samt",  0, -41400, "Pacific/Pago_Pago"             },
+       { "samt",  0, -41400, "Pacific/Samoa"                 },
+       { "samt",  0, -41400, "US/Samoa"                      },
+       { "samt",  0,  14400, "Europe/Samara"                 },
+       { "sast",  1,  10800, "Africa/Johannesburg"           },
+       { "sast",  0,   7200, "Africa/Johannesburg"           },
+       { "sast",  1,  10800, "Africa/Maseru"                 },
+       { "sast",  1,  10800, "Africa/Windhoek"               },
+       { "sast",  0,   7200, "Africa/Maseru"                 },
+       { "sast",  0,   7200, "Africa/Mbabane"                },
+       { "sast",  0,   7200, "Africa/Windhoek"               },
+       { "sbt",   0,  39600, "Pacific/Guadalcanal"           },
+       { "sct",   0,  14400, "Indian/Mahe"                   },
+       { "sgt",   0,  27000, "Asia/Singapore"                },
+       { "sgt",   0,  28800, "Asia/Singapore"                },
+       { "sgt",   0,  27000, "Singapore"                     },
+       { "sgt",   0,  28800, "Singapore"                     },
+       { "shest", 1,  21600, "Asia/Aqtau"                    },
+       { "shet",  0,  18000, "Asia/Aqtau"                    },
+       { "shet",  0,  21600, "Asia/Aqtau"                    },
+       { "slst",  1,  -1200, "Africa/Freetown"               },
+       { "slst",  1,   3600, "Africa/Freetown"               },
+       { "smt",   0,  25580, "Asia/Saigon"                   },
+       { "smt",   0,  25580, "Asia/Phnom_Penh"               },
+       { "smt",   0,  25580, "Asia/Vientiane"                },
+       { "srt",   0, -10800, "America/Paramaribo"            },
+       { "srt",   0, -12600, "America/Paramaribo"            },
+       { "sst",   0, -39600, "Pacific/Samoa"                 },
+       { "sst",   0, -39600, "Pacific/Midway"                },
+       { "sst",   0, -39600, "Pacific/Pago_Pago"             },
+       { "sst",   0, -39600, "US/Samoa"                      },
+       { "svest", 1,  18000, "Asia/Yekaterinburg"            },
+       { "svest", 1,  21600, "Asia/Yekaterinburg"            },
+       { "svet",  0,  14400, "Asia/Yekaterinburg"            },
+       { "svet",  0,  18000, "Asia/Yekaterinburg"            },
+       { "syot",  0,  10800, "Antarctica/Syowa"              },
+       { "taht",  0, -36000, "Pacific/Tahiti"                },
+       { "tasst", 1,  21600, "Asia/Samarkand"                },
+       { "tasst", 1,  25200, "Asia/Samarkand"                },
+       { "tasst", 1,  21600, "Asia/Tashkent"                 },
+       { "tasst", 1,  25200, "Asia/Tashkent"                 },
+       { "tast",  0,  21600, "Asia/Samarkand"                },
+       { "tast",  0,  18000, "Asia/Tashkent"                 },
+       { "tast",  0,  21600, "Asia/Tashkent"                 },
+       { "tbist", 1,  14400, "Asia/Tbilisi"                  },
+       { "tbist", 1,  18000, "Asia/Tbilisi"                  },
+       { "tbit",  0,  10800, "Asia/Tbilisi"                  },
+       { "tbit",  0,  14400, "Asia/Tbilisi"                  },
+       { "tft",   0,  18000, "Indian/Kerguelen"              },
+       { "tjt",   0,  18000, "Asia/Dushanbe"                 },
+       { "tlt",   0,  28800, "Asia/Dili"                     },
+       { "tlt",   0,  32400, "Asia/Dili"                     },
+       { "tmt",   0,  12344, "Asia/Tehran"                   },
+       { "tmt",   0,  12344, "Iran"                          },
+       { "tmt",   0,  14400, "Asia/Ashgabat"                 },
+       { "tmt",   0,  14400, "Asia/Ashkhabad"                },
+       { "tmt",   0,  18000, "Asia/Ashgabat"                 },
+       { "tmt",   0,  18000, "Asia/Ashkhabad"                },
+       { "tmt",   0,   5940, "Europe/Tallinn"                },
+       { "tost",  1,  50400, "Pacific/Tongatapu"             },
+       { "tot",   0,  46800, "Pacific/Tongatapu"             },
+       { "trst",  1,  14400, "Europe/Istanbul"               },
+       { "trst",  1,  14400, "Asia/Istanbul"                 },
+       { "trst",  1,  14400, "Turkey"                        },
+       { "trt",   0,  10800, "Europe/Istanbul"               },
+       { "trt",   0,  10800, "Asia/Istanbul"                 },
+       { "trt",   0,  10800, "Turkey"                        },
+       { "ulast", 1,  32400, "Asia/Ulaanbaatar"              },
+       { "ulast", 1,  32400, "Asia/Ulan_Bator"               },
+       { "ulat",  0,  25200, "Asia/Ulaanbaatar"              },
+       { "ulat",  0,  28800, "Asia/Ulaanbaatar"              },
+       { "ulat",  0,  25200, "Asia/Choibalsan"               },
+       { "ulat",  0,  25200, "Asia/Ulan_Bator"               },
+       { "ulat",  0,  28800, "Asia/Choibalsan"               },
+       { "ulat",  0,  28800, "Asia/Ulan_Bator"               },
+       { "urast", 1,  18000, "Asia/Oral"                     },
+       { "urast", 1,  21600, "Asia/Oral"                     },
+       { "urat",  0,  14400, "Asia/Oral"                     },
+       { "urat",  0,  18000, "Asia/Oral"                     },
+       { "urat",  0,  21600, "Asia/Oral"                     },
+       { "urut",  0,  21600, "Asia/Urumqi"                   },
+       { "uyhst", 1, -10800, "America/Montevideo"            },
+       { "uyhst", 1,  -9000, "America/Montevideo"            },
+       { "uyst",  1,  -7200, "America/Montevideo"            },
+       { "uyt",   0, -10800, "America/Montevideo"            },
+       { "uyt",   0, -12600, "America/Montevideo"            },
+       { "uzst",  1,  21600, "Asia/Samarkand"                },
+       { "uzst",  1,  21600, "Asia/Tashkent"                 },
+       { "uzt",   0,  18000, "Asia/Samarkand"                },
+       { "uzt",   0,  18000, "Asia/Tashkent"                 },
+       { "vet",   0, -14400, "America/Caracas"               },
+       { "vet",   0, -16200, "America/Caracas"               },
+       { "vlasst", 1,  36000, "Asia/Vladivostok"              },
+       { "vlast", 0,  32400, "Asia/Vladivostok"              },
+       { "vlast", 1,  39600, "Asia/Vladivostok"              },
+       { "vlat",  0,  32400, "Asia/Vladivostok"              },
+       { "vlat",  0,  36000, "Asia/Vladivostok"              },
+       { "vost",  0,  21600, "Antarctica/Vostok"             },
+       { "vust",  1,  43200, "Pacific/Efate"                 },
+       { "vut",   0,  39600, "Pacific/Efate"                 },
+       { "warst", 1, -10800, "America/Mendoza"               },
+       { "warst", 1, -10800, "America/Argentina/Jujuy"       },
+       { "warst", 1, -10800, "America/Argentina/Mendoza"     },
+       { "warst", 1, -10800, "America/Jujuy"                 },
+       { "wart",  0, -14400, "America/Mendoza"               },
+       { "wart",  0, -14400, "America/Argentina/Catamarca"   },
+       { "wart",  0, -14400, "America/Argentina/ComodRivadavia" },
+       { "wart",  0, -14400, "America/Argentina/Cordoba"     },
+       { "wart",  0, -14400, "America/Argentina/Jujuy"       },
+       { "wart",  0, -14400, "America/Argentina/La_Rioja"    },
+       { "wart",  0, -14400, "America/Argentina/Mendoza"     },
+       { "wart",  0, -14400, "America/Argentina/Rio_Gallegos" },
+       { "wart",  0, -14400, "America/Argentina/San_Juan"    },
+       { "wart",  0, -14400, "America/Argentina/Tucuman"     },
+       { "wart",  0, -14400, "America/Argentina/Ushuaia"     },
+       { "wart",  0, -14400, "America/Catamarca"             },
+       { "wart",  0, -14400, "America/Cordoba"               },
+       { "wart",  0, -14400, "America/Jujuy"                 },
+       { "wart",  0, -14400, "America/Rosario"               },
+       { "wast",  1,   7200, "Africa/Windhoek"               },
+       { "wast",  1,   7200, "Africa/Ndjamena"               },
+       { "wat",   0,  -3600, "Africa/Dakar"                  },
+       { "wat",   0,  -3600, "Africa/Bamako"                 },
+       { "wat",   0,  -3600, "Africa/Banjul"                 },
+       { "wat",   0,  -3600, "Africa/Bissau"                 },
+       { "wat",   0,  -3600, "Africa/Conakry"                },
+       { "wat",   0,  -3600, "Africa/El_Aaiun"               },
+       { "wat",   0,  -3600, "Africa/Freetown"               },
+       { "wat",   0,  -3600, "Africa/Niamey"                 },
+       { "wat",   0,  -3600, "Africa/Nouakchott"             },
+       { "wat",   0,  -3600, "Africa/Timbuktu"               },
+       { "wat",   0,      0, "Africa/Freetown"               },
+       { "wat",   0,   3600, "Africa/Brazzaville"            },
+       { "wat",   0,   3600, "Africa/Bangui"                 },
+       { "wat",   0,   3600, "Africa/Douala"                 },
+       { "wat",   0,   3600, "Africa/Lagos"                  },
+       { "wat",   0,   3600, "Africa/Libreville"             },
+       { "wat",   0,   3600, "Africa/Luanda"                 },
+       { "wat",   0,   3600, "Africa/Malabo"                 },
+       { "wat",   0,   3600, "Africa/Ndjamena"               },
+       { "wat",   0,   3600, "Africa/Niamey"                 },
+       { "wat",   0,   3600, "Africa/Porto-Novo"             },
+       { "wat",   0,   3600, "Africa/Windhoek"               },
+       { "wemt",  1,   7200, "Europe/Lisbon"                 },
+       { "wemt",  1,   7200, "Europe/Madrid"                 },
+       { "wemt",  1,   7200, "Europe/Monaco"                 },
+       { "wemt",  1,   7200, "Europe/Paris"                  },
+       { "wemt",  1,   7200, "Portugal"                      },
+       { "west",  1,   3600, "Europe/Paris"                  },
+       { "west",  1,   3600, "Africa/Algiers"                },
+       { "west",  1,   3600, "Africa/Casablanca"             },
+       { "west",  1,   3600, "Africa/Ceuta"                  },
+       { "west",  1,   3600, "Atlantic/Canary"               },
+       { "west",  1,   3600, "Atlantic/Faeroe"               },
+       { "west",  1,   3600, "Atlantic/Madeira"              },
+       { "west",  1,   3600, "Europe/Brussels"               },
+       { "west",  1,   3600, "Europe/Lisbon"                 },
+       { "west",  1,   3600, "Europe/Luxembourg"             },
+       { "west",  1,   3600, "Europe/Madrid"                 },
+       { "west",  1,   3600, "Europe/Monaco"                 },
+       { "west",  1,   3600, "Portugal"                      },
+       { "west",  1,   7200, "Europe/Luxembourg"             },
+       { "wet",   0,      0, "Europe/Paris"                  },
+       { "wet",   0,      0, "Africa/Algiers"                },
+       { "wet",   0,      0, "Africa/Casablanca"             },
+       { "wet",   0,      0, "Africa/Ceuta"                  },
+       { "wet",   0,      0, "Africa/El_Aaiun"               },
+       { "wet",   0,      0, "Atlantic/Azores"               },
+       { "wet",   0,      0, "Atlantic/Canary"               },
+       { "wet",   0,      0, "Atlantic/Faeroe"               },
+       { "wet",   0,      0, "Atlantic/Madeira"              },
+       { "wet",   0,      0, "Europe/Brussels"               },
+       { "wet",   0,      0, "Europe/Lisbon"                 },
+       { "wet",   0,      0, "Europe/Luxembourg"             },
+       { "wet",   0,      0, "Europe/Madrid"                 },
+       { "wet",   0,      0, "Europe/Monaco"                 },
+       { "wet",   0,      0, "Portugal"                      },
+       { "wet",   0,   3600, "Europe/Luxembourg"             },
+       { "wgst",  1,  -7200, "America/Godthab"               },
+       { "wgst",  1,  -7200, "America/Danmarkshavn"          },
+       { "wgt",   0, -10800, "America/Godthab"               },
+       { "wgt",   0, -10800, "America/Danmarkshavn"          },
+       { "wit",   0,  25200, "Asia/Jakarta"                  },
+       { "wit",   0,  27000, "Asia/Jakarta"                  },
+       { "wit",   0,  28800, "Asia/Jakarta"                  },
+       { "wit",   0,  25200, "Asia/Pontianak"                },
+       { "wit",   0,  27000, "Asia/Pontianak"                },
+       { "wit",   0,  28800, "Asia/Pontianak"                },
+       { "wst",   0,  28800, "Australia/Perth"               },
+       { "wst",   1,  32400, "Australia/Perth"               },
+       { "wst",   0, -39600, "Pacific/Apia"                  },
+       { "wst",   0,  28800, "Antarctica/Casey"              },
+       { "wst",   0,  28800, "Australia/West"                },
+       { "wst",   1,  32400, "Australia/West"                },
+       { "yakst", 1,  32400, "Asia/Yakutsk"                  },
+       { "yakst", 1,  36000, "Asia/Yakutsk"                  },
+       { "yakt",  0,  28800, "Asia/Yakutsk"                  },
+       { "yakt",  0,  32400, "Asia/Yakutsk"                  },
+       { "yddt",  1, -25200, "America/Dawson"                },
+       { "yddt",  1, -25200, "America/Whitehorse"            },
+       { "yddt",  1, -25200, "Canada/Yukon"                  },
+       { "ydt",   1, -28800, "America/Dawson"                },
+       { "ydt",   1, -28800, "America/Whitehorse"            },
+       { "ydt",   1, -28800, "America/Yakutat"               },
+       { "ydt",   1, -28800, "Canada/Yukon"                  },
+       { "yekst", 1,  21600, "Asia/Yekaterinburg"            },
+       { "yekt",  0,  18000, "Asia/Yekaterinburg"            },
+       { "yerst", 1,  14400, "Asia/Yerevan"                  },
+       { "yerst", 1,  18000, "Asia/Yerevan"                  },
+       { "yert",  0,  10800, "Asia/Yerevan"                  },
+       { "yert",  0,  14400, "Asia/Yerevan"                  },
+       { "ypt",   1, -28800, "America/Dawson"                },
+       { "ypt",   1, -28800, "America/Whitehorse"            },
+       { "ypt",   1, -28800, "America/Yakutat"               },
+       { "ypt",   1, -28800, "Canada/Yukon"                  },
+       { "yst",   0, -32400, "America/Anchorage"             },
+       { "yst",   0, -32400, "America/Dawson"                },
+       { "yst",   0, -32400, "America/Juneau"                },
+       { "yst",   0, -32400, "America/Nome"                  },
+       { "yst",   0, -32400, "America/Whitehorse"            },
+       { "yst",   0, -32400, "America/Yakutat"               },
+       { "yst",   0, -32400, "Canada/Yukon"                  },
+       { "yst",   0, -32400, "US/Alaska"                     },
+       { "ywt",   1, -28800, "America/Dawson"                },
+       { "ywt",   1, -28800, "America/Whitehorse"            },
+       { "ywt",   1, -28800, "America/Yakutat"               },
+       { "ywt",   1, -28800, "Canada/Yukon"                  },
+       { "a",     0,   3600, NULL                            },
+       { "b",     0,   7200, NULL                            },
+       { "c",     0,  10800, NULL                            },
+       { "d",     0,  14400, NULL                            },
+       { "e",     0,  18000, NULL                            },
+       { "f",     0,  21600, NULL                            },
+       { "g",     0,  25200, NULL                            },
+       { "h",     0,  28800, NULL                            },
+       { "i",     0,  32400, NULL                            },
+       { "k",     0,  36000, NULL                            },
+       { "l",     0,  39600, NULL                            },
+       { "m",     0,  43200, NULL                            },
+       { "n",     0,  -3600, NULL                            },
+       { "o",     0,  -7200, NULL                            },
+       { "p",     0, -10800, NULL                            },
+       { "q",     0, -14400, NULL                            },
+       { "r",     0, -18000, NULL                            },
+       { "s",     0, -21600, NULL                            },
+       { "t",     0, -25200, NULL                            },
+       { "u",     0, -28800, NULL                            },
+       { "v",     0, -32400, NULL                            },
+       { "w",     0, -36000, NULL                            },
+       { "x",     0, -39600, NULL                            },
+       { "y",     0, -43200, NULL                            },
+       { "zzz",   0,      0, "Antarctica/Davis"              },
+       { "zzz",   0,      0, "Antarctica/DumontDUrville"     },
+       { "z",     0,      0, NULL                            },
index 199e38f4586fab66279c3c4d05577d28377a6f9a..4fd5c62f92944ecef749ac3631e2b115ce6a4274 100644 (file)
@@ -267,7 +267,7 @@ static char* guess_timezone(TSRMLS_D)
        }
        /* Check environment variable */
        env = getenv("TZ");
-       if (env && *env) {
+       if (env && *env && strlen(env)) {
                return env;
        }
        /* Check config setting for default timezone */
@@ -283,12 +283,12 @@ static char* guess_timezone(TSRMLS_D)
                
                the_time = time(NULL);
                ta = php_localtime_r(&the_time, &tmbuf);
-               tzid = timelib_timezone_id_from_abbr(ta->tm_zone);
+               tzid = timelib_timezone_id_from_abbr(ta->tm_zone, ta->tm_gmtoff, ta->tm_isdst);
                if (! tzid) {
                        tzid = "UTC";
                }
                
-               php_error_docref(NULL TSRMLS_CC, E_STRICT, "It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use '%s' for '%s' instead.", tzid, ta->tm_zone);
+               php_error_docref(NULL TSRMLS_CC, E_STRICT, "It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use '%s' for '%s/%.1f/%s' instead.", tzid, ta->tm_zone, (float) (ta->tm_gmtoff / 3600), ta->tm_isdst ? "DST" : "no DST");
                return tzid;
        }
 #endif
@@ -1367,7 +1367,7 @@ PHP_FUNCTION(timezone_open)
        if (!tzi) {
                char *tzid;
                
-               tzid = timelib_timezone_id_from_abbr(tz);
+               tzid = timelib_timezone_id_from_abbr(tz, -1, 0);
                if (tzid) {
                        tzi = timelib_parse_tzfile(tzid);
                }
@@ -1464,12 +1464,12 @@ PHP_FUNCTION(timezone_abbreviations_list)
        table = timelib_timezone_abbreviations_list();
        array_init(return_value);
        entry = table;
-
+#warning NEED TO MAKE SURE ABBRS ARE NOT UNIQUEIZED HERE
        do {
                MAKE_STD_ZVAL(element);
                array_init(element);
                add_assoc_bool(element, "dst", entry->type);
-               add_assoc_long(element, "offset", - entry->value * 60);
+               add_assoc_long(element, "offset", entry->gmtoffset);
                if (entry->full_tz_name) {
                        add_assoc_string(element, "timezone_id", entry->full_tz_name, 1);
                } else {
index a36a49a8bff1613ad19c93f66f9d082307c179f1..f81981a497b2232fa5fe74c68ef5cd6959677d2f 100644 (file)
@@ -6,7 +6,11 @@ date.timezone=
 <?php
        putenv('TZ=');
        echo date_default_timezone_get(), "\n";
+       echo date('e'), "\n";
 ?>
 --EXPECTF--
-Strict Standards: date_default_timezone_get(): It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use 'UTC' for 'UTC' instead. in %sdate_default_timezone_get-1.php on line 3
-UTC
+Strict Standards: date_default_timezone_get(): It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use 'Europe/London' for 'UTC/0.0/no DST' instead. in %sdate_default_timezone_get-1.php on line 3
+Europe/London
+
+Strict Standards: date(): It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use 'Europe/London' for 'UTC/0.0/no DST' instead. in %sdate_default_timezone_get-1.php on line 4
+Europe/London
index 340366358c9e18d65ac55ab849268e772e5c81bb..2c30f0686be1c2fa424962d304d7d6792320afd4 100644 (file)
@@ -5,16 +5,24 @@ date.timezone=
 --FILE--
 <?php
        putenv("TZ=");
-       $date1 = strtotime("2005-07-12 08:00:00");
-       date_default_timezone_set("America/Indiana/Knox");
+       $date1 = strtotime("2005-01-12 08:00:00");
        $date2 = strtotime("2005-07-12 08:00:00");
+       date_default_timezone_set("America/Indiana/Knox");
+       $date3 = strtotime("2005-01-12 08:00:00");
+       $date4 = strtotime("2005-07-12 08:00:00");
 
        echo date_default_timezone_get(), "\n";
        echo date(DATE_ISO8601, $date1), "\n";
        echo date(DATE_ISO8601, $date2), "\n";
+       echo date(DATE_ISO8601, $date3), "\n";
+       echo date(DATE_ISO8601, $date4), "\n";
 ?>
 --EXPECTF--
-Strict Standards: strtotime(): It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use 'UTC' for 'UTC' instead. in %sdate_default_timezone_set-1.php on line 3
+Strict Standards: strtotime(): It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use 'Europe/London' for 'UTC/0.0/no DST' instead. in %sdate_default_timezone_set-1.php on line 3
+
+Strict Standards: strtotime(): It is not safe to rely on the systems timezone settings, please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. We use 'Europe/London' for 'UTC/0.0/no DST' instead. in %sdate_default_timezone_set-1.php on line 4
 America/Indiana/Knox
-2005-07-12T03:00:00-0500
+2005-01-12T03:00:00-0500
+2005-07-12T02:00:00-0500
+2005-01-12T08:00:00-0500
 2005-07-12T08:00:00-0500