From: Derick Rethans Date: Sat, 1 Oct 2005 15:07:20 +0000 (+0000) Subject: - MF51: Implemented better timezone guessing algorithm. X-Git-Tag: RELEASE_0_9_0~65 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2eaf85c481c11f1fc514a7c59f4ef4ca581afaf2;p=php - MF51: Implemented better timezone guessing algorithm. --- diff --git a/ext/date/lib/fallbackmap.h b/ext/date/lib/fallbackmap.h new file mode 100644 index 0000000000..b6c3760616 --- /dev/null +++ b/ext/date/lib/fallbackmap.h @@ -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" }, diff --git a/ext/date/lib/parse_date.c b/ext/date/lib/parse_date.c index 8fcaa86ba1..86271f2568 100644 --- a/ext/date/lib/parse_date.c +++ b/ext/date/lib/parse_date.c @@ -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 "" +#line 735 "" { 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 "" +#line 823 "" 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 "" +#line 906 "" 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 "" +#line 1754 "" 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 "" +#line 1763 "" 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 "" +#line 2153 "" 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 "" +#line 2717 "" 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 "" +#line 2757 "" 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 "" +#line 3075 "" 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 "" +#line 8068 "" 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 "" +#line 8219 "" 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 "" +#line 8474 "" 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 "" +#line 8733 "" 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 "" +#line 10058 "" 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 "" +#line 11790 "" 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 "" +#line 11888 "" 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 "" +#line 12000 "" 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 "" +#line 12109 "" 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 "" +#line 12604 "" 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 "" +#line 13092 "" 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 "" +#line 13120 "" 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 "" +#line 13294 "" 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 "" +#line 13534 "" 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 "" +#line 13650 "" 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 "" +#line 13777 "" 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 "" +#line 13964 "" 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 "" +#line 13986 "" 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 "" +#line 14059 "" 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 "" +#line 14167 "" 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 "" +#line 14264 "" 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 "" +#line 14696 "" 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 "" +#line 15306 "" 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 "" +#line 15404 "" 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 "" +#line 15668 "" 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 "" +#line 15732 "" 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 "" +#line 15748 "" 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 "" +#line 15784 "" 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 "" +#line 15835 "" } } -#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 { diff --git a/ext/date/lib/parse_date.re b/ext/date/lib/parse_date.re index a3fdcfa894..f5ca76b12a 100644 --- a/ext/date/lib/parse_date.re +++ b/ext/date/lib/parse_date.re @@ -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 { diff --git a/ext/date/lib/resource/parse_date.re b/ext/date/lib/resource/parse_date.re index a3fdcfa894..f5ca76b12a 100644 --- a/ext/date/lib/resource/parse_date.re +++ b/ext/date/lib/resource/parse_date.re @@ -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 { diff --git a/ext/date/lib/timelib.h b/ext/date/lib/timelib.h index ab3507f97b..8e6f5a7244 100644 --- a/ext/date/lib/timelib.h +++ b/ext/date/lib/timelib.h @@ -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 */ diff --git a/ext/date/lib/timelib_structs.h b/ext/date/lib/timelib_structs.h index 7648318016..dfaf72a680 100644 --- a/ext/date/lib/timelib_structs.h +++ b/ext/date/lib/timelib_structs.h @@ -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 index 0000000000..d2ec99d7ee --- /dev/null +++ b/ext/date/lib/timezonemap.h @@ -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 }, diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 199e38f458..4fd5c62f92 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -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 { diff --git a/ext/date/tests/date_default_timezone_get-1.phpt b/ext/date/tests/date_default_timezone_get-1.phpt index a36a49a8bf..f81981a497 100644 --- a/ext/date/tests/date_default_timezone_get-1.phpt +++ b/ext/date/tests/date_default_timezone_get-1.phpt @@ -6,7 +6,11 @@ date.timezone= --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 diff --git a/ext/date/tests/date_default_timezone_set-1.phpt b/ext/date/tests/date_default_timezone_set-1.phpt index 340366358c..2c30f0686b 100644 --- a/ext/date/tests/date_default_timezone_set-1.phpt +++ b/ext/date/tests/date_default_timezone_set-1.phpt @@ -5,16 +5,24 @@ date.timezone= --FILE-- --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