diff --git a/changelogs/unreleased/gh-6751-olson-timezones.md b/changelogs/unreleased/gh-6751-olson-timezones.md index f9c577d4e9755d78598751daff416188e4fe052e..107507e3081ede7dd596af9633a91e0613c6c47c 100644 --- a/changelogs/unreleased/gh-6751-olson-timezones.md +++ b/changelogs/unreleased/gh-6751-olson-timezones.md @@ -2,3 +2,6 @@ * `isdst` field in datetime object is now properly calculated according to IANA tzdata (aka Olson DB) rules for given date/time moment (gh-6751); + * `datetime` module exports bidirectional `TZ` array, which may be used + for translation of timezone index (`tzindex`) to timezone names, and in + reverse (gh-6751); diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c53190a0c6176f07c3b113bbaded5ee5b1386b8b..6fca3a8882d415e78a5c3c06a5a7d5626ac79481 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -63,6 +63,7 @@ lua_source(lua_sources lua/httpc.lua httpc_lua) lua_source(lua_sources lua/iconv.lua iconv_lua) lua_source(lua_sources lua/swim.lua swim_lua) lua_source(lua_sources lua/datetime.lua datetime_lua) +lua_source(lua_sources lua/timezones.lua timezones_lua) # LuaJIT jit.* library lua_source(lua_sources ${LUAJIT_SOURCE_ROOT}/src/jit/bc.lua jit_bc_lua) diff --git a/src/lib/tzcode/CMakeLists.txt b/src/lib/tzcode/CMakeLists.txt index 51791554153df28a7aed4576f5f65bf5d3760061..9ec59c9e35fd2537c294fee98ce5b129e6e4e40c 100644 --- a/src/lib/tzcode/CMakeLists.txt +++ b/src/lib/tzcode/CMakeLists.txt @@ -8,6 +8,7 @@ set(TZCODE_PREFIX_DIR tz) set(TZCODE_PREFIX ${TZCODE_BUILD_DIR}/${TZCODE_PREFIX_DIR}) set(TZDATA_TARGET main.zi) set(TZCODE_SRC ${PROJECT_SOURCE_DIR}/src/lib/tzcode) +set(TZLUA_SRC ${PROJECT_SOURCE_DIR}/src/lua) set(TZDATA_FULL_TARGET ${TZCODE_PREFIX}/src/${TZCODE_PROJECT}/${TZDATA_TARGET}) @@ -40,9 +41,10 @@ find_program(PERL perl) add_custom_target(gen-timezones DEPENDS ${TZCODE_PROJECT}) add_custom_command(TARGET gen-timezones COMMAND - ${PERL} ${TZCODE_SRC}/gen-zone-abbrevs.pl ${TZCODE_SRC}/zone-abbrevs.txt - ${TZDATA_FULL_TARGET} > ${TZCODE_SRC}/timezones.h - COMMENT "Generating timezones.h" + ${PERL} ${TZCODE_SRC}/gen-zone-abbrevs.pl + ${TZCODE_SRC}/zone-abbrevs.txt ${TZDATA_FULL_TARGET} + ${TZCODE_SRC}/timezones.h ${TZLUA_SRC}/timezones.lua + COMMENT "Generating timezones.h and timezones.lua" ) # We excluded build of gen-timezones and tzcode-iana (main.zi) targets @@ -51,4 +53,5 @@ add_custom_command(TARGET gen-timezones # ```sh # make gen-timezones VERBOSE=1 # ``` -# it will regenerate `timezones.h` in-place, in their repository location. +# it will regenerate `timezones.h`, `timezones.lua` in-place, in their +# repository location. diff --git a/src/lib/tzcode/gen-zone-abbrevs.pl b/src/lib/tzcode/gen-zone-abbrevs.pl index 61ae07b428d047e96bd6ad1723724f9c1e51ed4d..5693121bc56a3048c7176682b23665032856d7ca 100755 --- a/src/lib/tzcode/gen-zone-abbrevs.pl +++ b/src/lib/tzcode/gen-zone-abbrevs.pl @@ -5,19 +5,21 @@ gen-zone-abbrevs.pl - generate list of timezones =head1 SYNOPSIS - gen-zone-abbrevs.pl [zone-abbrevs.txt [main.zi]] > timezones.h + gen-zone-abbrevs.pl [zone-abbrevs.txt [main.zi [timezones.h [timezones.lua]]]] Options: first argument is zone-abbrevs.txt or it's equivalent second argument is main.zi of it's equivalent + third is a name of output header file (timezones.h by default) + fourth is a name of output lua config (timezones.lua by default) =head1 DESCRIPTION Reads input description of known IANA timezone abbreviations (including single- letter military zone names, e.g. Zulu 'Z'), and list of zones from Olson/tzcode -main.zi file, and then generates set of macro calls defining timezone with all -attributes. +main.zi file, and then generates set of C/C++ macro calls defining timezone +with all attributes. ZONE_ABBREV( 25, 0, "Z", TZ_MILITARY) ZONE_ABBREV( 112, 0, "UT", TZ_UTC|TZ_RFC) @@ -35,6 +37,13 @@ different artifact which could be used from other language (i.e. Go, or Python). We guarantee that constants assigned to particular zone will be maintained in future. To simplify future updates we leave some holes in list. +Another artifact - is Lua config file, which defines table for converting of +timezone index to the timezone name. e.g. + [25] = "Z", + [1000] = "Etc/GMT", + +This config file is loaded by datetime.lua module into public `TZ` table. + NB! In a future, for the next versions of Olson/tzdata database, we plan to automate updates of generated list. At the moment we leave it as manual process. @@ -43,6 +52,11 @@ automate updates of generated list. At the moment we leave it as manual process. use strict; use warnings; +my $zone_abbrevs_file = shift || 'zone-abbrevs.txt'; +my $tzdata_zi_file = shift || 'main.zi'; +my $output_h_file = shift || 'timezones.h'; +my $output_lua_file = shift || 'timezones.lua'; + my $next_id = 0; my $last_first = undef; @@ -118,9 +132,6 @@ BEGIN { %FlagName = reverse %flags; } -my $zone_abbrevs_file = shift || 'zone-abbrevs.txt'; -my $tzdata_zi_file = shift || 'main.zi'; - # ACT -05:00 # Acre Time (South America) # ACT +10:30 / +09:30 # Australian Central Time (Australia) # ACWST +08:45 # Australian Central Western Standard Time (Australia) @@ -189,8 +200,9 @@ sub read_abbrevs_file($) { } my %ZoneNames; -my %ZoneIds; -my %Aliases; +my %ZoneIds; # number to name +my %ZoneRevIds; # name to number +my %Aliases; # name to name sub read_zi_file($) { my $filename = shift; @@ -215,6 +227,16 @@ sub read_zi_file($) { } +my $out_h; +my $out_lua; + +sub open_out_files() { + open($out_h, ">$output_h_file") or + die qq<Could not open '$output_h_file' for writing: '$!'>; + open($out_lua, ">$output_lua_file") or + die qq<Could not open '$output_lua_file' for writing: '$!'>; +} + # first we generate abbreviations list sub gen_abbrevs() { foreach my $encoded ( sort { $a <=> $b } keys %ZoneAbbrevs ) { @@ -233,7 +255,7 @@ sub gen_abbrevs() { $flags = join '|', @names; } - printf "ZONE_ABBREV(%4d, %4d, \"%s\", %s)\n", + printf $out_h "ZONE_ABBREV(%4d, %4d, \"%s\", %s)\n", $nextid, $offset, $name, $flags; } } @@ -242,8 +264,9 @@ sub gen_abbrevs() { sub gen_primary_zones() { foreach my $zonename (sort keys %ZoneNames) { my $nextid = next_id($zonename); - $ZoneIds{$zonename} = $nextid; - printf "ZONE_UNIQUE(%4d, \"%s\")\n", $nextid, $zonename; + $ZoneRevIds{$zonename} = $nextid; + $ZoneIds{$nextid} = $zonename; + printf $out_h "ZONE_UNIQUE(%4d, \"%s\")\n", $nextid, $zonename; } } @@ -251,19 +274,31 @@ sub gen_primary_zones() { sub gen_aliases() { foreach my $alias ( sort keys %Aliases ) { my $zonename = $Aliases{$alias}; - printf "ZONE_ALIAS(%4d, \"%s\", \"%s\")\n", $ZoneIds{$zonename}, + printf $out_h "ZONE_ALIAS(%4d, \"%s\", \"%s\")\n", $ZoneRevIds{$zonename}, $alias, $zonename; } } -sub gen_header() { - printf "/* Automatically generated by gen-zone-abbrevs.pl */\n"; +sub gen_c_header() { + printf $out_h "/* Automatically generated by gen-zone-abbrevs.pl */\n"; gen_abbrevs(); gen_primary_zones(); gen_aliases(); } +sub gen_lua_config() { + print $out_lua "-- Automatically generated by gen-zone-abbrevs.pl\n"; + print $out_lua "return {\n"; + foreach my $nextid (sort { $a <=> $b } keys %ZoneIds) { + printf $out_lua " [%4d] = \"%s\",\n", $nextid, $ZoneIds{$nextid}; + printf $out_lua " [\"%s\"] = %d,\n", $ZoneIds{$nextid}, $nextid; + } + print $out_lua "}\n"; +} + read_abbrevs_file($zone_abbrevs_file); read_zi_file($tzdata_zi_file); -gen_header(); +open_out_files(); +gen_c_header(); +gen_lua_config() diff --git a/src/lua/datetime.lua b/src/lua/datetime.lua index 7a44fb02d2da2a7bd10d427d7dc6360c5ad4bc6e..dddcd8aecd1a3db50a635cb831012eb16f0169ed 100644 --- a/src/lua/datetime.lua +++ b/src/lua/datetime.lua @@ -1,5 +1,6 @@ local ffi = require('ffi') local buffer = require('buffer') +local tz = require('timezones') --[[ `c-dt` library functions handles properly both positive and negative `dt` @@ -1253,5 +1254,6 @@ return setmetatable( parse = datetime_parse_from, parse_date = datetime_parse_date, is_datetime = is_datetime, + TZ = tz, }, {} ) diff --git a/src/lua/init.c b/src/lua/init.c index 8160e024104dcdc0dd2ce7a0217db8ed4fdfc93d..d3a265eb8cd2b425bb6ed1a0cbcf6f8d382d67f6 100644 --- a/src/lua/init.c +++ b/src/lua/init.c @@ -153,7 +153,8 @@ extern char strict_lua[], sysprof_parse_lua[], sysprof_collapse_lua[], sysprof_lua[], - datetime_lua[] + datetime_lua[], + timezones_lua[] #if defined(EMBED_LUAROCKS) , luarocks_core_hardcoded_lua[], luarocks_admin_cache_lua[], @@ -305,6 +306,7 @@ static const char *lua_modules[] = { "sysprof.parse", sysprof_parse_lua, "sysprof.collapse", sysprof_collapse_lua, "sysprof", sysprof_lua, + "timezones", timezones_lua, "datetime", datetime_lua, NULL }; diff --git a/src/lua/timezones.lua b/src/lua/timezones.lua new file mode 100644 index 0000000000000000000000000000000000000000..4c9dc4d898c6d4f5e50a464c98aebb373c21c173 --- /dev/null +++ b/src/lua/timezones.lua @@ -0,0 +1,1263 @@ +-- Automatically generated by gen-zone-abbrevs.pl +return { + [ 1] = "A", + ["A"] = 1, + [ 2] = "B", + ["B"] = 2, + [ 3] = "C", + ["C"] = 3, + [ 4] = "D", + ["D"] = 4, + [ 5] = "E", + ["E"] = 5, + [ 6] = "F", + ["F"] = 6, + [ 7] = "G", + ["G"] = 7, + [ 8] = "H", + ["H"] = 8, + [ 9] = "I", + ["I"] = 9, + [ 10] = "K", + ["K"] = 10, + [ 11] = "L", + ["L"] = 11, + [ 12] = "M", + ["M"] = 12, + [ 13] = "N", + ["N"] = 13, + [ 14] = "O", + ["O"] = 14, + [ 15] = "P", + ["P"] = 15, + [ 16] = "Q", + ["Q"] = 16, + [ 17] = "R", + ["R"] = 17, + [ 18] = "S", + ["S"] = 18, + [ 19] = "T", + ["T"] = 19, + [ 20] = "U", + ["U"] = 20, + [ 21] = "V", + ["V"] = 21, + [ 22] = "W", + ["W"] = 22, + [ 23] = "X", + ["X"] = 23, + [ 24] = "Y", + ["Y"] = 24, + [ 25] = "Z", + ["Z"] = 25, + [ 32] = "AT", + ["AT"] = 32, + [ 40] = "BT", + ["BT"] = 40, + [ 48] = "CT", + ["CT"] = 48, + [ 56] = "ET", + ["ET"] = 56, + [ 64] = "GT", + ["GT"] = 64, + [ 72] = "IT", + ["IT"] = 72, + [ 80] = "KT", + ["KT"] = 80, + [ 88] = "MT", + ["MT"] = 88, + [ 96] = "PT", + ["PT"] = 96, + [ 104] = "ST", + ["ST"] = 104, + [ 112] = "UT", + ["UT"] = 112, + [ 120] = "WT", + ["WT"] = 120, + [ 128] = "ACT", + ["ACT"] = 128, + [ 129] = "ADT", + ["ADT"] = 129, + [ 130] = "AET", + ["AET"] = 130, + [ 131] = "AFT", + ["AFT"] = 131, + [ 132] = "AMT", + ["AMT"] = 132, + [ 133] = "AoE", + ["AoE"] = 133, + [ 134] = "ART", + ["ART"] = 134, + [ 135] = "AST", + ["AST"] = 135, + [ 136] = "AZT", + ["AZT"] = 136, + [ 144] = "BDT", + ["BDT"] = 144, + [ 145] = "BNT", + ["BNT"] = 145, + [ 146] = "BOT", + ["BOT"] = 146, + [ 147] = "BRT", + ["BRT"] = 147, + [ 148] = "BST", + ["BST"] = 148, + [ 149] = "BTT", + ["BTT"] = 149, + [ 152] = "CAT", + ["CAT"] = 152, + [ 153] = "CCT", + ["CCT"] = 153, + [ 154] = "CDT", + ["CDT"] = 154, + [ 155] = "CET", + ["CET"] = 155, + [ 156] = "CIT", + ["CIT"] = 156, + [ 157] = "CKT", + ["CKT"] = 157, + [ 158] = "CLT", + ["CLT"] = 158, + [ 159] = "COT", + ["COT"] = 159, + [ 160] = "CST", + ["CST"] = 160, + [ 161] = "CVT", + ["CVT"] = 161, + [ 162] = "CXT", + ["CXT"] = 162, + [ 168] = "EAT", + ["EAT"] = 168, + [ 169] = "ECT", + ["ECT"] = 169, + [ 170] = "EDT", + ["EDT"] = 170, + [ 171] = "EET", + ["EET"] = 171, + [ 172] = "EGT", + ["EGT"] = 172, + [ 173] = "EST", + ["EST"] = 173, + [ 176] = "FET", + ["FET"] = 176, + [ 177] = "FJT", + ["FJT"] = 177, + [ 178] = "FKT", + ["FKT"] = 178, + [ 179] = "FNT", + ["FNT"] = 179, + [ 184] = "GET", + ["GET"] = 184, + [ 185] = "GFT", + ["GFT"] = 185, + [ 186] = "GMT", + ["GMT"] = 186, + [ 187] = "GST", + ["GST"] = 187, + [ 188] = "GYT", + ["GYT"] = 188, + [ 192] = "HAA", + ["HAA"] = 192, + [ 193] = "HAC", + ["HAC"] = 193, + [ 194] = "HAE", + ["HAE"] = 194, + [ 195] = "HAP", + ["HAP"] = 195, + [ 196] = "HAR", + ["HAR"] = 196, + [ 197] = "HAT", + ["HAT"] = 197, + [ 198] = "HDT", + ["HDT"] = 198, + [ 199] = "HKT", + ["HKT"] = 199, + [ 200] = "HLV", + ["HLV"] = 200, + [ 201] = "HNA", + ["HNA"] = 201, + [ 202] = "HNC", + ["HNC"] = 202, + [ 203] = "HNE", + ["HNE"] = 203, + [ 204] = "HNP", + ["HNP"] = 204, + [ 205] = "HNR", + ["HNR"] = 205, + [ 206] = "HNT", + ["HNT"] = 206, + [ 207] = "HST", + ["HST"] = 207, + [ 208] = "ICT", + ["ICT"] = 208, + [ 209] = "IDT", + ["IDT"] = 209, + [ 210] = "IOT", + ["IOT"] = 210, + [ 211] = "IST", + ["IST"] = 211, + [ 216] = "JST", + ["JST"] = 216, + [ 224] = "KGT", + ["KGT"] = 224, + [ 225] = "KIT", + ["KIT"] = 225, + [ 226] = "KST", + ["KST"] = 226, + [ 232] = "MCK", + ["MCK"] = 232, + [ 233] = "MDT", + ["MDT"] = 233, + [ 234] = "MEZ", + ["MEZ"] = 234, + [ 235] = "MHT", + ["MHT"] = 235, + [ 236] = "MMT", + ["MMT"] = 236, + [ 237] = "MSD", + ["MSD"] = 237, + [ 238] = "MSK", + ["MSK"] = 238, + [ 239] = "MST", + ["MST"] = 239, + [ 240] = "MUT", + ["MUT"] = 240, + [ 241] = "MVT", + ["MVT"] = 241, + [ 242] = "MYT", + ["MYT"] = 242, + [ 248] = "NCT", + ["NCT"] = 248, + [ 249] = "NDT", + ["NDT"] = 249, + [ 250] = "NFT", + ["NFT"] = 250, + [ 251] = "NPT", + ["NPT"] = 251, + [ 252] = "NRT", + ["NRT"] = 252, + [ 253] = "NST", + ["NST"] = 253, + [ 254] = "NUT", + ["NUT"] = 254, + [ 256] = "OEZ", + ["OEZ"] = 256, + [ 264] = "PDT", + ["PDT"] = 264, + [ 265] = "PET", + ["PET"] = 265, + [ 266] = "PGT", + ["PGT"] = 266, + [ 267] = "PHT", + ["PHT"] = 267, + [ 268] = "PKT", + ["PKT"] = 268, + [ 269] = "PST", + ["PST"] = 269, + [ 270] = "PWT", + ["PWT"] = 270, + [ 271] = "PYT", + ["PYT"] = 271, + [ 272] = "RET", + ["RET"] = 272, + [ 280] = "SBT", + ["SBT"] = 280, + [ 281] = "SCT", + ["SCT"] = 281, + [ 282] = "SGT", + ["SGT"] = 282, + [ 283] = "SRT", + ["SRT"] = 283, + [ 284] = "SST", + ["SST"] = 284, + [ 288] = "TFT", + ["TFT"] = 288, + [ 289] = "TJT", + ["TJT"] = 289, + [ 290] = "TKT", + ["TKT"] = 290, + [ 291] = "TLT", + ["TLT"] = 291, + [ 292] = "TMT", + ["TMT"] = 292, + [ 293] = "TOT", + ["TOT"] = 293, + [ 294] = "TRT", + ["TRT"] = 294, + [ 295] = "TVT", + ["TVT"] = 295, + [ 296] = "UTC", + ["UTC"] = 296, + [ 297] = "UYT", + ["UYT"] = 297, + [ 298] = "UZT", + ["UZT"] = 298, + [ 304] = "VET", + ["VET"] = 304, + [ 305] = "VUT", + ["VUT"] = 305, + [ 312] = "WAT", + ["WAT"] = 312, + [ 313] = "WDT", + ["WDT"] = 313, + [ 314] = "WET", + ["WET"] = 314, + [ 315] = "WEZ", + ["WEZ"] = 315, + [ 316] = "WFT", + ["WFT"] = 316, + [ 317] = "WGT", + ["WGT"] = 317, + [ 318] = "WIB", + ["WIB"] = 318, + [ 319] = "WIT", + ["WIT"] = 319, + [ 320] = "WST", + ["WST"] = 320, + [ 328] = "ACDT", + ["ACDT"] = 328, + [ 329] = "ACST", + ["ACST"] = 329, + [ 330] = "ADST", + ["ADST"] = 330, + [ 331] = "AEDT", + ["AEDT"] = 331, + [ 332] = "AEST", + ["AEST"] = 332, + [ 333] = "AKDT", + ["AKDT"] = 333, + [ 334] = "AKST", + ["AKST"] = 334, + [ 335] = "ALMT", + ["ALMT"] = 335, + [ 336] = "AMDT", + ["AMDT"] = 336, + [ 337] = "AMST", + ["AMST"] = 337, + [ 338] = "ANAT", + ["ANAT"] = 338, + [ 339] = "AQTT", + ["AQTT"] = 339, + [ 340] = "AWDT", + ["AWDT"] = 340, + [ 341] = "AWST", + ["AWST"] = 341, + [ 342] = "AZOT", + ["AZOT"] = 342, + [ 343] = "AZST", + ["AZST"] = 343, + [ 344] = "BDST", + ["BDST"] = 344, + [ 345] = "BRST", + ["BRST"] = 345, + [ 352] = "CAST", + ["CAST"] = 352, + [ 353] = "CDST", + ["CDST"] = 353, + [ 354] = "CEDT", + ["CEDT"] = 354, + [ 355] = "CEST", + ["CEST"] = 355, + [ 356] = "CHOT", + ["CHOT"] = 356, + [ 357] = "ChST", + ["ChST"] = 357, + [ 358] = "CHUT", + ["CHUT"] = 358, + [ 359] = "CIST", + ["CIST"] = 359, + [ 360] = "CLDT", + ["CLDT"] = 360, + [ 361] = "CLST", + ["CLST"] = 361, + [ 368] = "DAVT", + ["DAVT"] = 368, + [ 369] = "DDUT", + ["DDUT"] = 369, + [ 376] = "EADT", + ["EADT"] = 376, + [ 377] = "EAST", + ["EAST"] = 377, + [ 378] = "ECST", + ["ECST"] = 378, + [ 379] = "EDST", + ["EDST"] = 379, + [ 380] = "EEDT", + ["EEDT"] = 380, + [ 381] = "EEST", + ["EEST"] = 381, + [ 382] = "EGST", + ["EGST"] = 382, + [ 384] = "FJDT", + ["FJDT"] = 384, + [ 385] = "FJST", + ["FJST"] = 385, + [ 386] = "FKDT", + ["FKDT"] = 386, + [ 387] = "FKST", + ["FKST"] = 387, + [ 392] = "GALT", + ["GALT"] = 392, + [ 393] = "GAMT", + ["GAMT"] = 393, + [ 394] = "GILT", + ["GILT"] = 394, + [ 400] = "HADT", + ["HADT"] = 400, + [ 401] = "HAST", + ["HAST"] = 401, + [ 402] = "HOVT", + ["HOVT"] = 402, + [ 408] = "IRDT", + ["IRDT"] = 408, + [ 409] = "IRKT", + ["IRKT"] = 409, + [ 410] = "IRST", + ["IRST"] = 410, + [ 416] = "KOST", + ["KOST"] = 416, + [ 417] = "KRAT", + ["KRAT"] = 417, + [ 418] = "KUYT", + ["KUYT"] = 418, + [ 424] = "LHDT", + ["LHDT"] = 424, + [ 425] = "LHST", + ["LHST"] = 425, + [ 426] = "LINT", + ["LINT"] = 426, + [ 432] = "MAGT", + ["MAGT"] = 432, + [ 433] = "MART", + ["MART"] = 433, + [ 434] = "MAWT", + ["MAWT"] = 434, + [ 435] = "MDST", + ["MDST"] = 435, + [ 436] = "MESZ", + ["MESZ"] = 436, + [ 440] = "NFDT", + ["NFDT"] = 440, + [ 441] = "NOVT", + ["NOVT"] = 441, + [ 442] = "NZDT", + ["NZDT"] = 442, + [ 443] = "NZST", + ["NZST"] = 443, + [ 448] = "OESZ", + ["OESZ"] = 448, + [ 449] = "OMST", + ["OMST"] = 449, + [ 450] = "ORAT", + ["ORAT"] = 450, + [ 456] = "PDST", + ["PDST"] = 456, + [ 457] = "PETT", + ["PETT"] = 457, + [ 458] = "PHOT", + ["PHOT"] = 458, + [ 459] = "PMDT", + ["PMDT"] = 459, + [ 460] = "PMST", + ["PMST"] = 460, + [ 461] = "PONT", + ["PONT"] = 461, + [ 462] = "PYST", + ["PYST"] = 462, + [ 464] = "QYZT", + ["QYZT"] = 464, + [ 472] = "ROTT", + ["ROTT"] = 472, + [ 480] = "SAKT", + ["SAKT"] = 480, + [ 481] = "SAMT", + ["SAMT"] = 481, + [ 482] = "SAST", + ["SAST"] = 482, + [ 483] = "SRET", + ["SRET"] = 483, + [ 484] = "SYOT", + ["SYOT"] = 484, + [ 488] = "TAHT", + ["TAHT"] = 488, + [ 489] = "TOST", + ["TOST"] = 489, + [ 496] = "ULAT", + ["ULAT"] = 496, + [ 497] = "UYST", + ["UYST"] = 497, + [ 504] = "VLAT", + ["VLAT"] = 504, + [ 505] = "VOST", + ["VOST"] = 505, + [ 512] = "WAKT", + ["WAKT"] = 512, + [ 513] = "WAST", + ["WAST"] = 513, + [ 514] = "WEDT", + ["WEDT"] = 514, + [ 515] = "WEST", + ["WEST"] = 515, + [ 516] = "WESZ", + ["WESZ"] = 516, + [ 517] = "WGST", + ["WGST"] = 517, + [ 518] = "WITA", + ["WITA"] = 518, + [ 520] = "YAKT", + ["YAKT"] = 520, + [ 521] = "YAPT", + ["YAPT"] = 521, + [ 522] = "YEKT", + ["YEKT"] = 522, + [ 528] = "ACWST", + ["ACWST"] = 528, + [ 529] = "ANAST", + ["ANAST"] = 529, + [ 530] = "AZODT", + ["AZODT"] = 530, + [ 531] = "AZOST", + ["AZOST"] = 531, + [ 536] = "CHADT", + ["CHADT"] = 536, + [ 537] = "CHAST", + ["CHAST"] = 537, + [ 538] = "CHODT", + ["CHODT"] = 538, + [ 539] = "CHOST", + ["CHOST"] = 539, + [ 540] = "CIDST", + ["CIDST"] = 540, + [ 544] = "EASST", + ["EASST"] = 544, + [ 545] = "EFATE", + ["EFATE"] = 545, + [ 552] = "HOVDT", + ["HOVDT"] = 552, + [ 553] = "HOVST", + ["HOVST"] = 553, + [ 560] = "IRKST", + ["IRKST"] = 560, + [ 568] = "KRAST", + ["KRAST"] = 568, + [ 576] = "MAGST", + ["MAGST"] = 576, + [ 584] = "NACDT", + ["NACDT"] = 584, + [ 585] = "NACST", + ["NACST"] = 585, + [ 586] = "NAEDT", + ["NAEDT"] = 586, + [ 587] = "NAEST", + ["NAEST"] = 587, + [ 588] = "NAMDT", + ["NAMDT"] = 588, + [ 589] = "NAMST", + ["NAMST"] = 589, + [ 590] = "NAPDT", + ["NAPDT"] = 590, + [ 591] = "NAPST", + ["NAPST"] = 591, + [ 592] = "NOVST", + ["NOVST"] = 592, + [ 600] = "OMSST", + ["OMSST"] = 600, + [ 608] = "PETST", + ["PETST"] = 608, + [ 616] = "SAMST", + ["SAMST"] = 616, + [ 624] = "ULAST", + ["ULAST"] = 624, + [ 632] = "VLAST", + ["VLAST"] = 632, + [ 640] = "WARST", + ["WARST"] = 640, + [ 648] = "YAKST", + ["YAKST"] = 648, + [ 649] = "YEKST", + ["YEKST"] = 649, + [ 656] = "CHODST", + ["CHODST"] = 656, + [ 664] = "HOVDST", + ["HOVDST"] = 664, + [ 672] = "Africa/Abidjan", + ["Africa/Abidjan"] = 672, + [ 673] = "Africa/Algiers", + ["Africa/Algiers"] = 673, + [ 674] = "Africa/Bissau", + ["Africa/Bissau"] = 674, + [ 675] = "Africa/Cairo", + ["Africa/Cairo"] = 675, + [ 676] = "Africa/Casablanca", + ["Africa/Casablanca"] = 676, + [ 677] = "Africa/Ceuta", + ["Africa/Ceuta"] = 677, + [ 678] = "Africa/El_Aaiun", + ["Africa/El_Aaiun"] = 678, + [ 679] = "Africa/Johannesburg", + ["Africa/Johannesburg"] = 679, + [ 680] = "Africa/Juba", + ["Africa/Juba"] = 680, + [ 681] = "Africa/Khartoum", + ["Africa/Khartoum"] = 681, + [ 682] = "Africa/Lagos", + ["Africa/Lagos"] = 682, + [ 683] = "Africa/Maputo", + ["Africa/Maputo"] = 683, + [ 684] = "Africa/Monrovia", + ["Africa/Monrovia"] = 684, + [ 685] = "Africa/Nairobi", + ["Africa/Nairobi"] = 685, + [ 686] = "Africa/Ndjamena", + ["Africa/Ndjamena"] = 686, + [ 687] = "Africa/Sao_Tome", + ["Africa/Sao_Tome"] = 687, + [ 688] = "Africa/Tripoli", + ["Africa/Tripoli"] = 688, + [ 689] = "Africa/Tunis", + ["Africa/Tunis"] = 689, + [ 690] = "Africa/Windhoek", + ["Africa/Windhoek"] = 690, + [ 691] = "America/Adak", + ["America/Adak"] = 691, + [ 692] = "America/Anchorage", + ["America/Anchorage"] = 692, + [ 693] = "America/Araguaina", + ["America/Araguaina"] = 693, + [ 694] = "America/Argentina/Buenos_Aires", + ["America/Argentina/Buenos_Aires"] = 694, + [ 695] = "America/Argentina/Catamarca", + ["America/Argentina/Catamarca"] = 695, + [ 696] = "America/Argentina/Cordoba", + ["America/Argentina/Cordoba"] = 696, + [ 697] = "America/Argentina/Jujuy", + ["America/Argentina/Jujuy"] = 697, + [ 698] = "America/Argentina/La_Rioja", + ["America/Argentina/La_Rioja"] = 698, + [ 699] = "America/Argentina/Mendoza", + ["America/Argentina/Mendoza"] = 699, + [ 700] = "America/Argentina/Rio_Gallegos", + ["America/Argentina/Rio_Gallegos"] = 700, + [ 701] = "America/Argentina/Salta", + ["America/Argentina/Salta"] = 701, + [ 702] = "America/Argentina/San_Juan", + ["America/Argentina/San_Juan"] = 702, + [ 703] = "America/Argentina/San_Luis", + ["America/Argentina/San_Luis"] = 703, + [ 704] = "America/Argentina/Tucuman", + ["America/Argentina/Tucuman"] = 704, + [ 705] = "America/Argentina/Ushuaia", + ["America/Argentina/Ushuaia"] = 705, + [ 706] = "America/Asuncion", + ["America/Asuncion"] = 706, + [ 707] = "America/Bahia", + ["America/Bahia"] = 707, + [ 708] = "America/Bahia_Banderas", + ["America/Bahia_Banderas"] = 708, + [ 709] = "America/Barbados", + ["America/Barbados"] = 709, + [ 710] = "America/Belem", + ["America/Belem"] = 710, + [ 711] = "America/Belize", + ["America/Belize"] = 711, + [ 712] = "America/Boa_Vista", + ["America/Boa_Vista"] = 712, + [ 713] = "America/Bogota", + ["America/Bogota"] = 713, + [ 714] = "America/Boise", + ["America/Boise"] = 714, + [ 715] = "America/Cambridge_Bay", + ["America/Cambridge_Bay"] = 715, + [ 716] = "America/Campo_Grande", + ["America/Campo_Grande"] = 716, + [ 717] = "America/Cancun", + ["America/Cancun"] = 717, + [ 718] = "America/Caracas", + ["America/Caracas"] = 718, + [ 719] = "America/Cayenne", + ["America/Cayenne"] = 719, + [ 720] = "America/Chicago", + ["America/Chicago"] = 720, + [ 721] = "America/Chihuahua", + ["America/Chihuahua"] = 721, + [ 722] = "America/Costa_Rica", + ["America/Costa_Rica"] = 722, + [ 723] = "America/Cuiaba", + ["America/Cuiaba"] = 723, + [ 724] = "America/Danmarkshavn", + ["America/Danmarkshavn"] = 724, + [ 725] = "America/Dawson", + ["America/Dawson"] = 725, + [ 726] = "America/Dawson_Creek", + ["America/Dawson_Creek"] = 726, + [ 727] = "America/Denver", + ["America/Denver"] = 727, + [ 728] = "America/Detroit", + ["America/Detroit"] = 728, + [ 729] = "America/Edmonton", + ["America/Edmonton"] = 729, + [ 730] = "America/Eirunepe", + ["America/Eirunepe"] = 730, + [ 731] = "America/El_Salvador", + ["America/El_Salvador"] = 731, + [ 732] = "America/Fort_Nelson", + ["America/Fort_Nelson"] = 732, + [ 733] = "America/Fortaleza", + ["America/Fortaleza"] = 733, + [ 734] = "America/Glace_Bay", + ["America/Glace_Bay"] = 734, + [ 735] = "America/Goose_Bay", + ["America/Goose_Bay"] = 735, + [ 736] = "America/Grand_Turk", + ["America/Grand_Turk"] = 736, + [ 737] = "America/Guatemala", + ["America/Guatemala"] = 737, + [ 738] = "America/Guayaquil", + ["America/Guayaquil"] = 738, + [ 739] = "America/Guyana", + ["America/Guyana"] = 739, + [ 740] = "America/Halifax", + ["America/Halifax"] = 740, + [ 741] = "America/Havana", + ["America/Havana"] = 741, + [ 742] = "America/Hermosillo", + ["America/Hermosillo"] = 742, + [ 743] = "America/Indiana/Indianapolis", + ["America/Indiana/Indianapolis"] = 743, + [ 744] = "America/Indiana/Knox", + ["America/Indiana/Knox"] = 744, + [ 745] = "America/Indiana/Marengo", + ["America/Indiana/Marengo"] = 745, + [ 746] = "America/Indiana/Petersburg", + ["America/Indiana/Petersburg"] = 746, + [ 747] = "America/Indiana/Tell_City", + ["America/Indiana/Tell_City"] = 747, + [ 748] = "America/Indiana/Vevay", + ["America/Indiana/Vevay"] = 748, + [ 749] = "America/Indiana/Vincennes", + ["America/Indiana/Vincennes"] = 749, + [ 750] = "America/Indiana/Winamac", + ["America/Indiana/Winamac"] = 750, + [ 751] = "America/Inuvik", + ["America/Inuvik"] = 751, + [ 752] = "America/Iqaluit", + ["America/Iqaluit"] = 752, + [ 753] = "America/Jamaica", + ["America/Jamaica"] = 753, + [ 754] = "America/Juneau", + ["America/Juneau"] = 754, + [ 755] = "America/Kentucky/Louisville", + ["America/Kentucky/Louisville"] = 755, + [ 756] = "America/Kentucky/Monticello", + ["America/Kentucky/Monticello"] = 756, + [ 757] = "America/La_Paz", + ["America/La_Paz"] = 757, + [ 758] = "America/Lima", + ["America/Lima"] = 758, + [ 759] = "America/Los_Angeles", + ["America/Los_Angeles"] = 759, + [ 760] = "America/Maceio", + ["America/Maceio"] = 760, + [ 761] = "America/Managua", + ["America/Managua"] = 761, + [ 762] = "America/Manaus", + ["America/Manaus"] = 762, + [ 763] = "America/Martinique", + ["America/Martinique"] = 763, + [ 764] = "America/Matamoros", + ["America/Matamoros"] = 764, + [ 765] = "America/Mazatlan", + ["America/Mazatlan"] = 765, + [ 766] = "America/Menominee", + ["America/Menominee"] = 766, + [ 767] = "America/Merida", + ["America/Merida"] = 767, + [ 768] = "America/Metlakatla", + ["America/Metlakatla"] = 768, + [ 769] = "America/Mexico_City", + ["America/Mexico_City"] = 769, + [ 770] = "America/Miquelon", + ["America/Miquelon"] = 770, + [ 771] = "America/Moncton", + ["America/Moncton"] = 771, + [ 772] = "America/Monterrey", + ["America/Monterrey"] = 772, + [ 773] = "America/Montevideo", + ["America/Montevideo"] = 773, + [ 774] = "America/New_York", + ["America/New_York"] = 774, + [ 775] = "America/Nipigon", + ["America/Nipigon"] = 775, + [ 776] = "America/Nome", + ["America/Nome"] = 776, + [ 777] = "America/Noronha", + ["America/Noronha"] = 777, + [ 778] = "America/North_Dakota/Beulah", + ["America/North_Dakota/Beulah"] = 778, + [ 779] = "America/North_Dakota/Center", + ["America/North_Dakota/Center"] = 779, + [ 780] = "America/North_Dakota/New_Salem", + ["America/North_Dakota/New_Salem"] = 780, + [ 781] = "America/Nuuk", + ["America/Nuuk"] = 781, + [ 782] = "America/Ojinaga", + ["America/Ojinaga"] = 782, + [ 783] = "America/Panama", + ["America/Panama"] = 783, + [ 784] = "America/Pangnirtung", + ["America/Pangnirtung"] = 784, + [ 785] = "America/Paramaribo", + ["America/Paramaribo"] = 785, + [ 786] = "America/Phoenix", + ["America/Phoenix"] = 786, + [ 787] = "America/Port-au-Prince", + ["America/Port-au-Prince"] = 787, + [ 788] = "America/Porto_Velho", + ["America/Porto_Velho"] = 788, + [ 789] = "America/Puerto_Rico", + ["America/Puerto_Rico"] = 789, + [ 790] = "America/Punta_Arenas", + ["America/Punta_Arenas"] = 790, + [ 791] = "America/Rainy_River", + ["America/Rainy_River"] = 791, + [ 792] = "America/Rankin_Inlet", + ["America/Rankin_Inlet"] = 792, + [ 793] = "America/Recife", + ["America/Recife"] = 793, + [ 794] = "America/Regina", + ["America/Regina"] = 794, + [ 795] = "America/Resolute", + ["America/Resolute"] = 795, + [ 796] = "America/Rio_Branco", + ["America/Rio_Branco"] = 796, + [ 797] = "America/Santarem", + ["America/Santarem"] = 797, + [ 798] = "America/Santiago", + ["America/Santiago"] = 798, + [ 799] = "America/Santo_Domingo", + ["America/Santo_Domingo"] = 799, + [ 800] = "America/Sao_Paulo", + ["America/Sao_Paulo"] = 800, + [ 801] = "America/Scoresbysund", + ["America/Scoresbysund"] = 801, + [ 802] = "America/Sitka", + ["America/Sitka"] = 802, + [ 803] = "America/St_Johns", + ["America/St_Johns"] = 803, + [ 804] = "America/Swift_Current", + ["America/Swift_Current"] = 804, + [ 805] = "America/Tegucigalpa", + ["America/Tegucigalpa"] = 805, + [ 806] = "America/Thule", + ["America/Thule"] = 806, + [ 807] = "America/Thunder_Bay", + ["America/Thunder_Bay"] = 807, + [ 808] = "America/Tijuana", + ["America/Tijuana"] = 808, + [ 809] = "America/Toronto", + ["America/Toronto"] = 809, + [ 810] = "America/Vancouver", + ["America/Vancouver"] = 810, + [ 811] = "America/Whitehorse", + ["America/Whitehorse"] = 811, + [ 812] = "America/Winnipeg", + ["America/Winnipeg"] = 812, + [ 813] = "America/Yakutat", + ["America/Yakutat"] = 813, + [ 814] = "America/Yellowknife", + ["America/Yellowknife"] = 814, + [ 815] = "Antarctica/Casey", + ["Antarctica/Casey"] = 815, + [ 816] = "Antarctica/Davis", + ["Antarctica/Davis"] = 816, + [ 817] = "Antarctica/Macquarie", + ["Antarctica/Macquarie"] = 817, + [ 818] = "Antarctica/Mawson", + ["Antarctica/Mawson"] = 818, + [ 819] = "Antarctica/Palmer", + ["Antarctica/Palmer"] = 819, + [ 820] = "Antarctica/Rothera", + ["Antarctica/Rothera"] = 820, + [ 821] = "Antarctica/Troll", + ["Antarctica/Troll"] = 821, + [ 822] = "Antarctica/Vostok", + ["Antarctica/Vostok"] = 822, + [ 823] = "Asia/Almaty", + ["Asia/Almaty"] = 823, + [ 824] = "Asia/Amman", + ["Asia/Amman"] = 824, + [ 825] = "Asia/Anadyr", + ["Asia/Anadyr"] = 825, + [ 826] = "Asia/Aqtau", + ["Asia/Aqtau"] = 826, + [ 827] = "Asia/Aqtobe", + ["Asia/Aqtobe"] = 827, + [ 828] = "Asia/Ashgabat", + ["Asia/Ashgabat"] = 828, + [ 829] = "Asia/Atyrau", + ["Asia/Atyrau"] = 829, + [ 830] = "Asia/Baghdad", + ["Asia/Baghdad"] = 830, + [ 831] = "Asia/Baku", + ["Asia/Baku"] = 831, + [ 832] = "Asia/Bangkok", + ["Asia/Bangkok"] = 832, + [ 833] = "Asia/Barnaul", + ["Asia/Barnaul"] = 833, + [ 834] = "Asia/Beirut", + ["Asia/Beirut"] = 834, + [ 835] = "Asia/Bishkek", + ["Asia/Bishkek"] = 835, + [ 836] = "Asia/Brunei", + ["Asia/Brunei"] = 836, + [ 837] = "Asia/Chita", + ["Asia/Chita"] = 837, + [ 838] = "Asia/Choibalsan", + ["Asia/Choibalsan"] = 838, + [ 839] = "Asia/Colombo", + ["Asia/Colombo"] = 839, + [ 840] = "Asia/Damascus", + ["Asia/Damascus"] = 840, + [ 841] = "Asia/Dhaka", + ["Asia/Dhaka"] = 841, + [ 842] = "Asia/Dili", + ["Asia/Dili"] = 842, + [ 843] = "Asia/Dubai", + ["Asia/Dubai"] = 843, + [ 844] = "Asia/Dushanbe", + ["Asia/Dushanbe"] = 844, + [ 845] = "Asia/Famagusta", + ["Asia/Famagusta"] = 845, + [ 846] = "Asia/Gaza", + ["Asia/Gaza"] = 846, + [ 847] = "Asia/Hebron", + ["Asia/Hebron"] = 847, + [ 848] = "Asia/Ho_Chi_Minh", + ["Asia/Ho_Chi_Minh"] = 848, + [ 849] = "Asia/Hong_Kong", + ["Asia/Hong_Kong"] = 849, + [ 850] = "Asia/Hovd", + ["Asia/Hovd"] = 850, + [ 851] = "Asia/Irkutsk", + ["Asia/Irkutsk"] = 851, + [ 852] = "Asia/Jakarta", + ["Asia/Jakarta"] = 852, + [ 853] = "Asia/Jayapura", + ["Asia/Jayapura"] = 853, + [ 854] = "Asia/Jerusalem", + ["Asia/Jerusalem"] = 854, + [ 855] = "Asia/Kabul", + ["Asia/Kabul"] = 855, + [ 856] = "Asia/Kamchatka", + ["Asia/Kamchatka"] = 856, + [ 857] = "Asia/Karachi", + ["Asia/Karachi"] = 857, + [ 858] = "Asia/Kathmandu", + ["Asia/Kathmandu"] = 858, + [ 859] = "Asia/Khandyga", + ["Asia/Khandyga"] = 859, + [ 860] = "Asia/Kolkata", + ["Asia/Kolkata"] = 860, + [ 861] = "Asia/Krasnoyarsk", + ["Asia/Krasnoyarsk"] = 861, + [ 862] = "Asia/Kuala_Lumpur", + ["Asia/Kuala_Lumpur"] = 862, + [ 863] = "Asia/Kuching", + ["Asia/Kuching"] = 863, + [ 864] = "Asia/Macau", + ["Asia/Macau"] = 864, + [ 865] = "Asia/Magadan", + ["Asia/Magadan"] = 865, + [ 866] = "Asia/Makassar", + ["Asia/Makassar"] = 866, + [ 867] = "Asia/Manila", + ["Asia/Manila"] = 867, + [ 868] = "Asia/Nicosia", + ["Asia/Nicosia"] = 868, + [ 869] = "Asia/Novokuznetsk", + ["Asia/Novokuznetsk"] = 869, + [ 870] = "Asia/Novosibirsk", + ["Asia/Novosibirsk"] = 870, + [ 871] = "Asia/Omsk", + ["Asia/Omsk"] = 871, + [ 872] = "Asia/Oral", + ["Asia/Oral"] = 872, + [ 873] = "Asia/Pontianak", + ["Asia/Pontianak"] = 873, + [ 874] = "Asia/Pyongyang", + ["Asia/Pyongyang"] = 874, + [ 875] = "Asia/Qatar", + ["Asia/Qatar"] = 875, + [ 876] = "Asia/Qostanay", + ["Asia/Qostanay"] = 876, + [ 877] = "Asia/Qyzylorda", + ["Asia/Qyzylorda"] = 877, + [ 878] = "Asia/Riyadh", + ["Asia/Riyadh"] = 878, + [ 879] = "Asia/Sakhalin", + ["Asia/Sakhalin"] = 879, + [ 880] = "Asia/Samarkand", + ["Asia/Samarkand"] = 880, + [ 881] = "Asia/Seoul", + ["Asia/Seoul"] = 881, + [ 882] = "Asia/Shanghai", + ["Asia/Shanghai"] = 882, + [ 883] = "Asia/Singapore", + ["Asia/Singapore"] = 883, + [ 884] = "Asia/Srednekolymsk", + ["Asia/Srednekolymsk"] = 884, + [ 885] = "Asia/Taipei", + ["Asia/Taipei"] = 885, + [ 886] = "Asia/Tashkent", + ["Asia/Tashkent"] = 886, + [ 887] = "Asia/Tbilisi", + ["Asia/Tbilisi"] = 887, + [ 888] = "Asia/Tehran", + ["Asia/Tehran"] = 888, + [ 889] = "Asia/Thimphu", + ["Asia/Thimphu"] = 889, + [ 890] = "Asia/Tokyo", + ["Asia/Tokyo"] = 890, + [ 891] = "Asia/Tomsk", + ["Asia/Tomsk"] = 891, + [ 892] = "Asia/Ulaanbaatar", + ["Asia/Ulaanbaatar"] = 892, + [ 893] = "Asia/Urumqi", + ["Asia/Urumqi"] = 893, + [ 894] = "Asia/Ust-Nera", + ["Asia/Ust-Nera"] = 894, + [ 895] = "Asia/Vladivostok", + ["Asia/Vladivostok"] = 895, + [ 896] = "Asia/Yakutsk", + ["Asia/Yakutsk"] = 896, + [ 897] = "Asia/Yangon", + ["Asia/Yangon"] = 897, + [ 898] = "Asia/Yekaterinburg", + ["Asia/Yekaterinburg"] = 898, + [ 899] = "Asia/Yerevan", + ["Asia/Yerevan"] = 899, + [ 900] = "Atlantic/Azores", + ["Atlantic/Azores"] = 900, + [ 901] = "Atlantic/Bermuda", + ["Atlantic/Bermuda"] = 901, + [ 902] = "Atlantic/Canary", + ["Atlantic/Canary"] = 902, + [ 903] = "Atlantic/Cape_Verde", + ["Atlantic/Cape_Verde"] = 903, + [ 904] = "Atlantic/Faroe", + ["Atlantic/Faroe"] = 904, + [ 905] = "Atlantic/Madeira", + ["Atlantic/Madeira"] = 905, + [ 906] = "Atlantic/Reykjavik", + ["Atlantic/Reykjavik"] = 906, + [ 907] = "Atlantic/South_Georgia", + ["Atlantic/South_Georgia"] = 907, + [ 908] = "Atlantic/Stanley", + ["Atlantic/Stanley"] = 908, + [ 909] = "Australia/Adelaide", + ["Australia/Adelaide"] = 909, + [ 910] = "Australia/Brisbane", + ["Australia/Brisbane"] = 910, + [ 911] = "Australia/Broken_Hill", + ["Australia/Broken_Hill"] = 911, + [ 912] = "Australia/Darwin", + ["Australia/Darwin"] = 912, + [ 913] = "Australia/Eucla", + ["Australia/Eucla"] = 913, + [ 914] = "Australia/Hobart", + ["Australia/Hobart"] = 914, + [ 915] = "Australia/Lindeman", + ["Australia/Lindeman"] = 915, + [ 916] = "Australia/Lord_Howe", + ["Australia/Lord_Howe"] = 916, + [ 917] = "Australia/Melbourne", + ["Australia/Melbourne"] = 917, + [ 918] = "Australia/Perth", + ["Australia/Perth"] = 918, + [ 919] = "Australia/Sydney", + ["Australia/Sydney"] = 919, + [ 920] = "Etc/GMT", + ["Etc/GMT"] = 920, + [ 921] = "Etc/UTC", + ["Etc/UTC"] = 921, + [ 922] = "Europe/Amsterdam", + ["Europe/Amsterdam"] = 922, + [ 923] = "Europe/Andorra", + ["Europe/Andorra"] = 923, + [ 924] = "Europe/Astrakhan", + ["Europe/Astrakhan"] = 924, + [ 925] = "Europe/Athens", + ["Europe/Athens"] = 925, + [ 926] = "Europe/Belgrade", + ["Europe/Belgrade"] = 926, + [ 927] = "Europe/Berlin", + ["Europe/Berlin"] = 927, + [ 928] = "Europe/Brussels", + ["Europe/Brussels"] = 928, + [ 929] = "Europe/Bucharest", + ["Europe/Bucharest"] = 929, + [ 930] = "Europe/Budapest", + ["Europe/Budapest"] = 930, + [ 931] = "Europe/Chisinau", + ["Europe/Chisinau"] = 931, + [ 932] = "Europe/Copenhagen", + ["Europe/Copenhagen"] = 932, + [ 933] = "Europe/Dublin", + ["Europe/Dublin"] = 933, + [ 934] = "Europe/Gibraltar", + ["Europe/Gibraltar"] = 934, + [ 935] = "Europe/Helsinki", + ["Europe/Helsinki"] = 935, + [ 936] = "Europe/Istanbul", + ["Europe/Istanbul"] = 936, + [ 937] = "Europe/Kaliningrad", + ["Europe/Kaliningrad"] = 937, + [ 938] = "Europe/Kiev", + ["Europe/Kiev"] = 938, + [ 939] = "Europe/Kirov", + ["Europe/Kirov"] = 939, + [ 940] = "Europe/Lisbon", + ["Europe/Lisbon"] = 940, + [ 941] = "Europe/London", + ["Europe/London"] = 941, + [ 942] = "Europe/Luxembourg", + ["Europe/Luxembourg"] = 942, + [ 943] = "Europe/Madrid", + ["Europe/Madrid"] = 943, + [ 944] = "Europe/Malta", + ["Europe/Malta"] = 944, + [ 945] = "Europe/Minsk", + ["Europe/Minsk"] = 945, + [ 946] = "Europe/Monaco", + ["Europe/Monaco"] = 946, + [ 947] = "Europe/Moscow", + ["Europe/Moscow"] = 947, + [ 948] = "Europe/Oslo", + ["Europe/Oslo"] = 948, + [ 949] = "Europe/Paris", + ["Europe/Paris"] = 949, + [ 950] = "Europe/Prague", + ["Europe/Prague"] = 950, + [ 951] = "Europe/Riga", + ["Europe/Riga"] = 951, + [ 952] = "Europe/Rome", + ["Europe/Rome"] = 952, + [ 953] = "Europe/Samara", + ["Europe/Samara"] = 953, + [ 954] = "Europe/Saratov", + ["Europe/Saratov"] = 954, + [ 955] = "Europe/Simferopol", + ["Europe/Simferopol"] = 955, + [ 956] = "Europe/Sofia", + ["Europe/Sofia"] = 956, + [ 957] = "Europe/Stockholm", + ["Europe/Stockholm"] = 957, + [ 958] = "Europe/Tallinn", + ["Europe/Tallinn"] = 958, + [ 959] = "Europe/Tirane", + ["Europe/Tirane"] = 959, + [ 960] = "Europe/Ulyanovsk", + ["Europe/Ulyanovsk"] = 960, + [ 961] = "Europe/Uzhgorod", + ["Europe/Uzhgorod"] = 961, + [ 962] = "Europe/Vienna", + ["Europe/Vienna"] = 962, + [ 963] = "Europe/Vilnius", + ["Europe/Vilnius"] = 963, + [ 964] = "Europe/Volgograd", + ["Europe/Volgograd"] = 964, + [ 965] = "Europe/Warsaw", + ["Europe/Warsaw"] = 965, + [ 966] = "Europe/Zaporozhye", + ["Europe/Zaporozhye"] = 966, + [ 967] = "Europe/Zurich", + ["Europe/Zurich"] = 967, + [ 968] = "Indian/Chagos", + ["Indian/Chagos"] = 968, + [ 969] = "Indian/Christmas", + ["Indian/Christmas"] = 969, + [ 970] = "Indian/Cocos", + ["Indian/Cocos"] = 970, + [ 971] = "Indian/Kerguelen", + ["Indian/Kerguelen"] = 971, + [ 972] = "Indian/Mahe", + ["Indian/Mahe"] = 972, + [ 973] = "Indian/Maldives", + ["Indian/Maldives"] = 973, + [ 974] = "Indian/Mauritius", + ["Indian/Mauritius"] = 974, + [ 975] = "Indian/Reunion", + ["Indian/Reunion"] = 975, + [ 976] = "Pacific/Apia", + ["Pacific/Apia"] = 976, + [ 977] = "Pacific/Auckland", + ["Pacific/Auckland"] = 977, + [ 978] = "Pacific/Bougainville", + ["Pacific/Bougainville"] = 978, + [ 979] = "Pacific/Chatham", + ["Pacific/Chatham"] = 979, + [ 980] = "Pacific/Chuuk", + ["Pacific/Chuuk"] = 980, + [ 981] = "Pacific/Easter", + ["Pacific/Easter"] = 981, + [ 982] = "Pacific/Efate", + ["Pacific/Efate"] = 982, + [ 983] = "Pacific/Fakaofo", + ["Pacific/Fakaofo"] = 983, + [ 984] = "Pacific/Fiji", + ["Pacific/Fiji"] = 984, + [ 985] = "Pacific/Funafuti", + ["Pacific/Funafuti"] = 985, + [ 986] = "Pacific/Galapagos", + ["Pacific/Galapagos"] = 986, + [ 987] = "Pacific/Gambier", + ["Pacific/Gambier"] = 987, + [ 988] = "Pacific/Guadalcanal", + ["Pacific/Guadalcanal"] = 988, + [ 989] = "Pacific/Guam", + ["Pacific/Guam"] = 989, + [ 990] = "Pacific/Honolulu", + ["Pacific/Honolulu"] = 990, + [ 991] = "Pacific/Kanton", + ["Pacific/Kanton"] = 991, + [ 992] = "Pacific/Kiritimati", + ["Pacific/Kiritimati"] = 992, + [ 993] = "Pacific/Kosrae", + ["Pacific/Kosrae"] = 993, + [ 994] = "Pacific/Kwajalein", + ["Pacific/Kwajalein"] = 994, + [ 995] = "Pacific/Majuro", + ["Pacific/Majuro"] = 995, + [ 996] = "Pacific/Marquesas", + ["Pacific/Marquesas"] = 996, + [ 997] = "Pacific/Nauru", + ["Pacific/Nauru"] = 997, + [ 998] = "Pacific/Niue", + ["Pacific/Niue"] = 998, + [ 999] = "Pacific/Norfolk", + ["Pacific/Norfolk"] = 999, + [1000] = "Pacific/Noumea", + ["Pacific/Noumea"] = 1000, + [1001] = "Pacific/Pago_Pago", + ["Pacific/Pago_Pago"] = 1001, + [1002] = "Pacific/Palau", + ["Pacific/Palau"] = 1002, + [1003] = "Pacific/Pitcairn", + ["Pacific/Pitcairn"] = 1003, + [1004] = "Pacific/Pohnpei", + ["Pacific/Pohnpei"] = 1004, + [1005] = "Pacific/Port_Moresby", + ["Pacific/Port_Moresby"] = 1005, + [1006] = "Pacific/Rarotonga", + ["Pacific/Rarotonga"] = 1006, + [1007] = "Pacific/Tahiti", + ["Pacific/Tahiti"] = 1007, + [1008] = "Pacific/Tarawa", + ["Pacific/Tarawa"] = 1008, + [1009] = "Pacific/Tongatapu", + ["Pacific/Tongatapu"] = 1009, + [1010] = "Pacific/Wake", + ["Pacific/Wake"] = 1010, + [1011] = "Pacific/Wallis", + ["Pacific/Wallis"] = 1011, +} diff --git a/test/app-tap/datetime.test.lua b/test/app-tap/datetime.test.lua index dca81104cd37feece8d7731e815b1ed985fecef3..b0fb130fbd31250ce3e674eb8cf17bf2ceab20b6 100755 --- a/test/app-tap/datetime.test.lua +++ b/test/app-tap/datetime.test.lua @@ -4,6 +4,7 @@ local tap = require('tap') local test = tap.test('errno') local date = require('datetime') local ffi = require('ffi') +local TZ = date.TZ --[[ Workaround for #6599 where we may randomly fail on AWS Graviton machines, @@ -597,7 +598,7 @@ test:test("Parsing of timezone abbrevs", function(test) end) test:test("Parsing of timezone names (tzindex)", function(test) - test:plan(308) + test:plan(396) local zone_abbrevs = { -- military A = 1, B = 2, C = 3, @@ -636,8 +637,12 @@ test:test("Parsing of timezone names (tzindex)", function(test) local date, len = date.parse(date_text) print(zone, index) test:isnt(date, nil, 'parse ' .. zone) - test:is(date.tzindex, index, 'expected tzindex') - test:is(date.tz, zone, 'expected timezone name') + local tzname = date.tz + local tzindex = date.tzindex + test:is(tzindex, index, 'expected tzindex') + test:is(tzname, zone, 'expected timezone name') + test:is(TZ[tzindex], tzname, ('TZ[%d] => %s'):format(tzindex, tzname)) + test:is(TZ[tzname], tzindex, ('TZ[%s] => %d'):format(tzname, tzindex)) test:ok(len > #base_date, 'length longer than ' .. #base_date) local txt = tostring(date) test:is(1, txt:find(exp_pattern), 'expected prefix')