From 7852777534407635904d3f6725dce272125c3767 Mon Sep 17 00:00:00 2001 From: Jesse Gumm Date: Wed, 30 Jun 2021 18:42:38 -0500 Subject: [PATCH] Reworked so that the tz_index is built as a module, rather than a raw dict, so it passes dialyzer --- Makefile | 8 +- ibuild.escript | 49 +++++ include/tz_index.hrl | 454 ------------------------------------------- rebar.config | 4 + src/ibuild.erl | 31 --- src/localtime.erl | 12 +- src/tz_index.erl | 405 ++++++++++++++++++++++++++++++++++++++ 7 files changed, 469 insertions(+), 494 deletions(-) create mode 100755 ibuild.escript delete mode 100644 include/tz_index.hrl delete mode 100755 src/ibuild.erl create mode 100644 src/tz_index.erl diff --git a/Makefile b/Makefile index 6b97d11..88c0f31 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,11 @@ -all: include/tz_index.hrl +all: src/tz_index.erl ./rebar3 compile check: ./rebar3 eunit -include/tz_index.hrl: src/ibuild.erl include/tz_database.hrl - cd include && ln -s ../src/ibuild.erl && escript ibuild.erl; EV=$$?; rm ibuild.erl; exit $$EV +src/tz_index.erl: include/tz_database.hrl + escript ibuild.escript +dialyzer: + ./rebar3 dialyzer diff --git a/ibuild.escript b/ibuild.escript new file mode 100755 index 0000000..7150a57 --- /dev/null +++ b/ibuild.escript @@ -0,0 +1,49 @@ +#!/usr/bin/env escript +%% @author Dmitry S. Melnikov (dmitryme@gmail.com) +%% @copyright 2010 Dmitry S. Melnikov + +-include("include/tz_database.hrl"). +-define(out, "src/tz_index.erl"). + +build_tzlist(TzName, Name, Dict) -> + case dict:find(Name, Dict) of + error -> + dict:store(Name, [TzName], Dict); + {ok, TzNames} -> + dict:store(Name, TzNames ++ [TzName], Dict) + end. + +build_index() -> + F = fun({TzName,{Name,_},{DName,_},_,_,_,_,_,_}, Acc) -> + NewDict = build_tzlist(TzName, Name, Acc), + build_tzlist(TzName, DName, NewDict); + ({TzName,{Name,_},undef,_,_,_,_,_,_}, Acc) -> + build_tzlist(TzName, Name, Acc) + end, + I = lists:foldl(F, dict:new(), ?tz_database), + List = dict:to_list(I), + LookupFunction = build_function_clauses(List), + AllFunction = build_all_function(List), + Header = "-module(tz_index).\n-export([lookup/1, all/0]).", + Body = [Header, "\n\n", LookupFunction, "\n\n", AllFunction], + file:write_file(?out, Body). + + +% {ok, File} = file:open("tz_index.hrl", [write]), +% io:fwrite(File, "-define(tz_index, ~p).\n", [I]). + + +build_function_clauses(List) -> + Clauses = lists:map(fun({K, V}) -> + io_lib:format("lookup(~p) -> ~p", [K, V]) + end, List), + [lists:join(";\n", Clauses), ";\n", + "lookup(_) -> error."]. + +build_all_function(List) -> + Keys = [K || {K, _} <- List], + io_lib:format("all() -> ~p.",[Keys]). + +%% So this can be run from escript: +main(_Args) -> + build_index(). diff --git a/include/tz_index.hrl b/include/tz_index.hrl deleted file mode 100644 index 95bd35e..0000000 --- a/include/tz_index.hrl +++ /dev/null @@ -1,454 +0,0 @@ --define(tz_index, {dict,202,41,64,32,205,123, - {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}, - {{[["WGST","America/Godthab"],["GMT+2","Etc/GMT+2"]], - [["NPT","Asia/Kathmandu","Asia/Katmandu"], - ["ACWST","Australia/Eucla"], - ["CCT","Indian/Cocos"]], - [["DAVT","Antarctica/Davis"], - ["AZT","Asia/Baku"], - ["HKT","Asia/Hong_Kong","Hongkong"]], - [["MST","America/Boise","America/Cambridge_Bay", - "America/Chihuahua","America/Creston", - "America/Dawson_Creek","America/Denver", - "America/Edmonton","America/Fort_Nelson", - "America/Hermosillo","America/Inuvik", - "America/Mazatlan","America/Ojinaga", - "America/Phoenix","America/Shiprock", - "America/Yellowknife","Canada/Mountain","MST", - "MST7MDT","Mexico/BajaSur","Navajo","US/Arizona", - "US/Mountain"], - ["GMT-7","Etc/GMT-7"]], - [["ROTT","Antarctica/Rothera"], - ["GMT-13","Etc/GMT-13"], - ["GMT-4","Etc/GMT-4"], - ["GAMT","Pacific/Gambier"]], - [["SGT","Asia/Singapore","Singapore"], - ["GMT-1","Etc/GMT-1"], - ["GMT-10","Etc/GMT-10"]], - [["SAKT","Asia/Sakhalin"], - ["LHST","Australia/LHI","Australia/Lord_Howe"], - ["MSK","Europe/Minsk","Europe/Moscow", - "Europe/Simferopol","Europe/Volgograd","W-SU"], - ["PHOT","Pacific/Enderbury"], - ["PWT","Pacific/Palau"]], - [["HDT","America/Adak","America/Atka","US/Aleutian"], - ["AST","America/Anguilla","America/Antigua", - "America/Aruba","America/Barbados", - "America/Blanc-Sablon","America/Curacao", - "America/Dominica","America/Glace_Bay", - "America/Goose_Bay","America/Grand_Turk", - "America/Grenada","America/Guadeloupe", - "America/Halifax","America/Kralendijk", - "America/Lower_Princes","America/Marigot", - "America/Martinique","America/Moncton", - "America/Montserrat","America/Port_of_Spain", - "America/Puerto_Rico","America/Santo_Domingo", - "America/St_Barthelemy","America/St_Kitts", - "America/St_Lucia","America/St_Thomas", - "America/St_Vincent","America/Thule", - "America/Tortola","America/Virgin","Asia/Aden", - "Asia/Baghdad","Asia/Bahrain","Asia/Kuwait", - "Asia/Qatar","Asia/Riyadh","Atlantic/Bermuda", - "Canada/Atlantic"]], - [["NST","America/St_Johns","Canada/Newfoundland"], - ["YEKT","Asia/Yekaterinburg"]], - [["BDT","Asia/Dacca","Asia/Dhaka"], - ["GMT+7","Etc/GMT+7"], - ["CKT","Pacific/Rarotonga"]], - [["HST","America/Adak","America/Atka","HST", - "Pacific/Honolulu","Pacific/Johnston", - "US/Aleutian","US/Hawaii"], - ["PKT","Asia/Karachi"], - ["NOVT","Asia/Novosibirsk"], - ["GMT+4","Etc/GMT+4"], - ["MVT","Indian/Maldives"], - ["VUT","Pacific/Efate"], - ["LINT","Pacific/Kiritimati"]], - [["WAT","Africa/Bangui","Africa/Brazzaville", - "Africa/Douala","Africa/Kinshasa","Africa/Lagos", - "Africa/Libreville","Africa/Luanda", - "Africa/Malabo","Africa/Ndjamena","Africa/Niamey", - "Africa/Porto-Novo","Africa/Windhoek"], - ["ECT","America/Guayaquil"], - ["VOST","Antarctica/Vostok"], - ["BNT","Asia/Brunei"], - ["TLT","Asia/Dili"], - ["HOVST","Asia/Hovd"], - ["ACDT","Australia/Adelaide", - "Australia/Broken_Hill","Australia/South", - "Australia/Yancowinna"], - ["GMT+1","Etc/GMT+1"], - ["CHADT","NZ-CHAT","Pacific/Chatham"], - ["FJT","Pacific/Fiji"]], - [["EEST","Asia/Amman","Asia/Beirut","Asia/Damascus", - "Asia/Gaza","Asia/Hebron","Asia/Istanbul", - "Asia/Nicosia","EET","Europe/Athens", - "Europe/Bucharest","Europe/Chisinau", - "Europe/Helsinki","Europe/Istanbul","Europe/Kiev", - "Europe/Mariehamn","Europe/Nicosia","Europe/Riga", - "Europe/Sofia","Europe/Tallinn","Europe/Tiraspol", - "Europe/Uzhgorod","Europe/Vilnius", - "Europe/Zaporozhye","Turkey"], - ["IDT","Asia/Jerusalem","Asia/Tel_Aviv","Israel"], - ["BST","Europe/Belfast","Europe/Guernsey", - "Europe/Isle_of_Man","Europe/Jersey", - "Europe/London","GB","GB-Eire", - "Pacific/Bougainville"], - ["KOST","Pacific/Kosrae"], - ["WFT","Pacific/Wallis"]], - [["ALMT","Asia/Almaty"], - ["CHOT","Asia/Choibalsan"], - ["SRET","Asia/Srednekolymsk"], - ["AZOT","Atlantic/Azores"], - ["GMT-9","Etc/GMT-9"], - ["MET","MET"], - ["TVT","Pacific/Funafuti"]], - [["SAST","Africa/Johannesburg","Africa/Maseru", - "Africa/Mbabane"], - ["CDT","America/Bahia_Banderas","America/Chicago", - "America/Havana","America/Indiana/Knox", - "America/Indiana/Tell_City","America/Knox_IN", - "America/Matamoros","America/Menominee", - "America/Merida","America/Mexico_City", - "America/Monterrey","America/North_Dakota/Beulah", - "America/North_Dakota/Center", - "America/North_Dakota/New_Salem", - "America/Rainy_River","America/Rankin_Inlet", - "America/Resolute","America/Winnipeg","CST6CDT", - "Canada/Central","Cuba","Mexico/General", - "US/Central","US/Indiana-Starke"], - ["ACST","Australia/Adelaide", - "Australia/Broken_Hill","Australia/Darwin", - "Australia/North","Australia/South", - "Australia/Yancowinna"], - ["GMT-6","Etc/GMT-6"], - ["CHAST","NZ-CHAT","Pacific/Chatham"]], - [["PYST","America/Asuncion"], - ["PDT","America/Dawson","America/Ensenada", - "America/Los_Angeles","America/Santa_Isabel", - "America/Tijuana","America/Vancouver", - "America/Whitehorse","Canada/Pacific", - "Canada/Yukon","Mexico/BajaNorte","PST8PDT", - "US/Pacific"], - ["IST","Asia/Calcutta","Asia/Colombo", - "Asia/Jerusalem","Asia/Kolkata","Asia/Tel_Aviv", - "Eire","Europe/Dublin","Israel"], - ["GET","Asia/Tbilisi"], - ["GMT-12","Etc/GMT-12"], - ["GMT-3","Etc/GMT-3"]]}, - {[["PMDT","America/Miquelon"], - ["GMT+11","Etc/GMT+11"]], - [["EAT","Africa/Addis_Ababa","Africa/Asmara", - "Africa/Asmera","Africa/Dar_es_Salaam", - "Africa/Djibouti","Africa/Juba","Africa/Kampala", - "Africa/Khartoum","Africa/Mogadishu", - "Africa/Nairobi","Indian/Antananarivo", - "Indian/Comoro","Indian/Mayotte"], - ["CST","America/Bahia_Banderas","America/Belize", - "America/Chicago","America/Costa_Rica", - "America/El_Salvador","America/Guatemala", - "America/Havana","America/Indiana/Knox", - "America/Indiana/Tell_City","America/Knox_IN", - "America/Managua","America/Matamoros", - "America/Menominee","America/Merida", - "America/Mexico_City","America/Monterrey", - "America/North_Dakota/Beulah", - "America/North_Dakota/Center", - "America/North_Dakota/New_Salem", - "America/Rainy_River","America/Rankin_Inlet", - "America/Regina","America/Resolute", - "America/Swift_Current","America/Tegucigalpa", - "America/Winnipeg","Asia/Chongqing", - "Asia/Chungking","Asia/Harbin","Asia/Macao", - "Asia/Macau","Asia/Shanghai","Asia/Taipei", - "CST6CDT","Canada/Central", - "Canada/East-Saskatchewan","Canada/Saskatchewan", - "Cuba","Mexico/General","PRC","ROC","US/Central", - "US/Indiana-Starke"], - ["TJT","Asia/Dushanbe"], - ["KRAT","Asia/Krasnoyarsk","Asia/Novokuznetsk"], - ["MYT","Asia/Kuala_Lumpur","Asia/Kuching"], - ["SCT","Indian/Mahe"]], - [["CEST","Africa/Ceuta","Antarctica/Troll", - "Arctic/Longyearbyen","Atlantic/Jan_Mayen","CET", - "Europe/Amsterdam","Europe/Andorra", - "Europe/Belgrade","Europe/Berlin", - "Europe/Bratislava","Europe/Brussels", - "Europe/Budapest","Europe/Busingen", - "Europe/Copenhagen","Europe/Gibraltar", - "Europe/Ljubljana","Europe/Luxembourg", - "Europe/Madrid","Europe/Malta","Europe/Monaco", - "Europe/Oslo","Europe/Paris","Europe/Podgorica", - "Europe/Prague","Europe/Rome","Europe/San_Marino", - "Europe/Sarajevo","Europe/Skopje", - "Europe/Stockholm","Europe/Tirane","Europe/Vaduz", - "Europe/Vatican","Europe/Vienna","Europe/Warsaw", - "Europe/Zagreb","Europe/Zurich","Poland"], - ["PST","America/Dawson","America/Ensenada", - "America/Los_Angeles","America/Metlakatla", - "America/Santa_Isabel","America/Tijuana", - "America/Vancouver","America/Whitehorse", - "Canada/Pacific","Canada/Yukon", - "Mexico/BajaNorte","PST8PDT","Pacific/Pitcairn", - "US/Pacific"], - ["AWST","Antarctica/Casey","Australia/Perth", - "Australia/West"], - ["SYOT","Antarctica/Syowa"], - ["VLAT","Asia/Ust-Nera","Asia/Vladivostok"], - ["CXT","Indian/Christmas"], - ["TOT","Pacific/Tongatapu"]], - [["AKDT","America/Anchorage","America/Juneau", - "America/Nome","America/Sitka","America/Yakutat", - "US/Alaska"], - ["GYT","America/Guyana"], - ["PMST","America/Miquelon"], - ["UTC","Etc/UTC","Antarctica/Troll", - "Etc/Universal","Etc/Zulu","UTC","Universal", - "Zulu"], - ["WIT","Asia/Jayapura"], - ["GMT+9","Etc/GMT+9"], - ["MART","Pacific/Marquesas"]], - [["SRT","America/Paramaribo"], - ["MAWT","Antarctica/Mawson"], - ["CHOST","Asia/Choibalsan"], - ["YAKT","Asia/Khandyga","Asia/Yakutsk"], - ["JST","Asia/Tokyo","Japan"], - ["AZOST","Atlantic/Azores"], - ["GMT+6","Etc/GMT+6"], - ["MHT","Kwajalein","Pacific/Kwajalein", - "Pacific/Majuro"], - ["MEST","MET"]], - [["MMT","Asia/Rangoon"], - ["ULAT","Asia/Ulaanbaatar","Asia/Ulan_Bator"], - ["AEDT","Australia/ACT","Australia/Canberra", - "Australia/Currie","Australia/Hobart", - "Australia/Melbourne","Australia/NSW", - "Australia/Sydney","Australia/Tasmania", - "Australia/Victoria"], - ["GMT+3","Etc/GMT+3"]], - [["WEST","Africa/Casablanca","Africa/El_Aaiun", - "Atlantic/Canary","Atlantic/Faeroe", - "Atlantic/Faroe","Atlantic/Madeira", - "Europe/Lisbon","Portugal","WET"], - ["AKST","America/Anchorage","America/Juneau", - "America/Nome","America/Sitka","America/Yakutat", - "US/Alaska"], - ["CLT","America/Santiago","Antarctica/Palmer", - "Chile/Continental"], - ["BRST","America/Sao_Paulo","Brazil/East"], - ["EGST","America/Scoresbysund"], - ["OMST","Asia/Omsk"], - ["PGT","Pacific/Port_Moresby"]], - [["GMT","Africa/Abidjan","Africa/Accra", - "Africa/Bamako","Africa/Banjul","Africa/Bissau", - "Africa/Conakry","Africa/Dakar","Africa/Freetown", - "Africa/Lome","Africa/Monrovia", - "Africa/Nouakchott","Africa/Ouagadougou", - "Africa/Sao_Tome","Africa/Timbuktu", - "America/Danmarkshavn","Atlantic/Reykjavik", - "Atlantic/St_Helena","Eire","Etc/GMT","Etc/GMT+0", - "Etc/GMT-0","Etc/GMT0","Etc/Greenwich", - "Europe/Belfast","Europe/Dublin", - "Europe/Guernsey","Europe/Isle_of_Man", - "Europe/Jersey","Europe/London","GB","GB-Eire", - "GMT","GMT+0","GMT-0","GMT0","Greenwich", - "Iceland"], - ["ACT","America/Eirunepe","America/Porto_Acre", - "America/Rio_Branco","Brazil/Acre"], - ["NZDT","Antarctica/McMurdo", - "Antarctica/South_Pole","NZ","Pacific/Auckland"], - ["GALT","Pacific/Galapagos"]], - [["EDT","America/Cayman","America/Detroit", - "America/Fort_Wayne", - "America/Indiana/Indianapolis", - "America/Indiana/Marengo", - "America/Indiana/Petersburg", - "America/Indiana/Vevay", - "America/Indiana/Vincennes", - "America/Indiana/Winamac","America/Indianapolis", - "America/Iqaluit","America/Kentucky/Louisville", - "America/Kentucky/Monticello", - "America/Louisville","America/Montreal", - "America/Nassau","America/New_York", - "America/Nipigon","America/Pangnirtung", - "America/Port-au-Prince","America/Thunder_Bay", - "America/Toronto","Canada/Eastern","EST5EDT", - "US/East-Indiana","US/Eastern","US/Michigan"], - ["BOT","America/La_Paz"], - ["TMT","Asia/Ashgabat","Asia/Ashkhabad"], - ["PETT","Asia/Kamchatka"], - ["CVT","Atlantic/Cape_Verde"], - ["AEST","Australia/ACT","Australia/Brisbane", - "Australia/Canberra","Australia/Currie", - "Australia/Hobart","Australia/Lindeman", - "Australia/Melbourne","Australia/NSW", - "Australia/Queensland","Australia/Sydney", - "Australia/Tasmania","Australia/Victoria"], - ["EAST","Chile/EasterIsland","Pacific/Easter"], - ["GMT-8","Etc/GMT-8"], - ["NCT","Pacific/Noumea"]], - [["AMT","America/Boa_Vista","America/Campo_Grande", - "America/Cuiaba","America/Manaus", - "America/Porto_Velho","Asia/Yerevan", - "Brazil/West"], - ["WGT","America/Godthab"], - ["UYT","America/Montevideo"], - ["IRKT","Asia/Chita","Asia/Irkutsk"], - ["WIB","Asia/Jakarta","Asia/Pontianak"], - ["KST","Asia/Pyongyang","Asia/Seoul","ROK"], - ["BTT","Asia/Thimbu","Asia/Thimphu"], - ["GMT-14","Etc/GMT-14"], - ["GMT-5","Etc/GMT-5"], - ["WSDT","Pacific/Apia"]], - [["ART","America/Argentina/Buenos_Aires", - "America/Argentina/Catamarca", - "America/Argentina/ComodRivadavia", - "America/Argentina/Cordoba", - "America/Argentina/Jujuy", - "America/Argentina/La_Rioja", - "America/Argentina/Mendoza", - "America/Argentina/Rio_Gallegos", - "America/Argentina/Salta", - "America/Argentina/San_Juan", - "America/Argentina/San_Luis", - "America/Argentina/Tucuman", - "America/Argentina/Ushuaia", - "America/Buenos_Aires","America/Catamarca", - "America/Cordoba","America/Jujuy", - "America/Mendoza","America/Rosario"], - ["VET","America/Caracas"], - ["NZST","Antarctica/McMurdo", - "Antarctica/South_Pole","NZ","Pacific/Auckland"], - ["GMT-11","Etc/GMT-11"], - ["GMT-2","Etc/GMT-2"], - ["WAKT","Pacific/Wake"]], - [["CET","Africa/Algiers","Africa/Ceuta", - "Africa/Tunis","Arctic/Longyearbyen", - "Atlantic/Jan_Mayen","CET","Europe/Amsterdam", - "Europe/Andorra","Europe/Belgrade", - "Europe/Berlin","Europe/Bratislava", - "Europe/Brussels","Europe/Budapest", - "Europe/Busingen","Europe/Copenhagen", - "Europe/Gibraltar","Europe/Ljubljana", - "Europe/Luxembourg","Europe/Madrid", - "Europe/Malta","Europe/Monaco","Europe/Oslo", - "Europe/Paris","Europe/Podgorica","Europe/Prague", - "Europe/Rome","Europe/San_Marino", - "Europe/Sarajevo","Europe/Skopje", - "Europe/Stockholm","Europe/Tirane","Europe/Vaduz", - "Europe/Vatican","Europe/Vienna","Europe/Warsaw", - "Europe/Zagreb","Europe/Zurich","Poland"], - ["EST","America/Atikokan","America/Cancun", - "America/Cayman","America/Coral_Harbour", - "America/Detroit","America/Fort_Wayne", - "America/Indiana/Indianapolis", - "America/Indiana/Marengo", - "America/Indiana/Petersburg", - "America/Indiana/Vevay", - "America/Indiana/Vincennes", - "America/Indiana/Winamac","America/Indianapolis", - "America/Iqaluit","America/Jamaica", - "America/Kentucky/Louisville", - "America/Kentucky/Monticello", - "America/Louisville","America/Montreal", - "America/Nassau","America/New_York", - "America/Nipigon","America/Panama", - "America/Pangnirtung","America/Port-au-Prince", - "America/Thunder_Bay","America/Toronto", - "Canada/Eastern","EST","EST5EDT","Jamaica", - "US/East-Indiana","US/Eastern","US/Michigan"], - ["ANAT","Asia/Anadyr"], - ["GMT+10","Etc/GMT+10"], - ["UCT","Etc/UCT","UCT"], - ["IOT","Indian/Chagos"], - ["CHUT","Pacific/Chuuk","Pacific/Truk", - "Pacific/Yap"], - ["NRT","Pacific/Nauru"]], - [["GFT","America/Cayenne"], - ["PET","America/Lima"], - ["HOVT","Asia/Hovd"], - ["ULAST","Asia/Ulaanbaatar","Asia/Ulan_Bator"], - ["WSST","Pacific/Apia"], - ["PONT","Pacific/Pohnpei","Pacific/Ponape"], - ["TAHT","Pacific/Tahiti"]], - [["COT","America/Bogota"], - ["KGT","Asia/Bishkek"], - ["TFT","Indian/Kerguelen"], - ["MUT","Indian/Mauritius"]], - [["AFT","Asia/Kabul"], - ["IRDT","Asia/Tehran","Iran"], - ["GMT+8","Etc/GMT+8"], - ["TKT","Pacific/Fakaofo"]], - [["WET","Africa/Casablanca","Africa/El_Aaiun", - "Atlantic/Canary","Atlantic/Faeroe", - "Atlantic/Faroe","Atlantic/Madeira", - "Europe/Lisbon","Portugal","WET"], - ["BRT","America/Araguaina","America/Bahia", - "America/Belem","America/Fortaleza", - "America/Maceio","America/Recife", - "America/Santarem","America/Sao_Paulo", - "Brazil/East"], - ["FNT","America/Noronha","Brazil/DeNoronha"], - ["EGT","America/Scoresbysund"], - ["ICT","Asia/Bangkok","Asia/Ho_Chi_Minh", - "Asia/Phnom_Penh","Asia/Saigon","Asia/Vientiane"], - ["GMT+5","Etc/GMT+5"], - ["NFT","Pacific/Norfolk"], - ["GILT","Pacific/Tarawa"]]}, - {[["PYT","America/Asuncion"], - ["MDT","America/Boise","America/Cambridge_Bay", - "America/Chihuahua","America/Denver", - "America/Edmonton","America/Inuvik", - "America/Mazatlan","America/Ojinaga", - "America/Shiprock","America/Yellowknife", - "Canada/Mountain","MST7MDT","Mexico/BajaSur", - "Navajo","US/Mountain"], - ["AMST","America/Campo_Grande","America/Cuiaba"], - ["SAMT","Europe/Samara"]], - [["AQTT","Asia/Aqtau","Asia/Aqtobe"], - ["AZST","Asia/Baku"], - ["IRST","Asia/Tehran","Iran"], - ["ChST","Pacific/Guam","Pacific/Saipan"], - ["SST","Pacific/Midway","Pacific/Pago_Pago", - "Pacific/Samoa","US/Samoa"]], - [["WAST","Africa/Windhoek"], - ["FJST","Pacific/Fiji"], - ["NUT","Pacific/Niue"]], - [["PHT","Asia/Manila"], - ["LHDT","Australia/LHI","Australia/Lord_Howe"]], - [["ADT","America/Glace_Bay","America/Goose_Bay", - "America/Halifax","America/Moncton", - "America/Thule","Atlantic/Bermuda", - "Canada/Atlantic"], - ["DDUT","Antarctica/DumontDUrville"], - ["MAGT","Asia/Magadan"], - ["SBT","Pacific/Guadalcanal"]], - [["EET","Africa/Cairo","Africa/Tripoli", - "Asia/Amman","Asia/Beirut","Asia/Damascus", - "Asia/Gaza","Asia/Hebron","Asia/Istanbul", - "Asia/Nicosia","EET","Egypt","Europe/Athens", - "Europe/Bucharest","Europe/Chisinau", - "Europe/Helsinki","Europe/Istanbul", - "Europe/Kaliningrad","Europe/Kiev", - "Europe/Mariehamn","Europe/Nicosia","Europe/Riga", - "Europe/Sofia","Europe/Tallinn","Europe/Tiraspol", - "Europe/Uzhgorod","Europe/Vilnius", - "Europe/Zaporozhye","Libya","Turkey"], - ["NDT","America/St_Johns","Canada/Newfoundland"], - ["GST","Asia/Dubai","Asia/Muscat", - "Atlantic/South_Georgia"], - ["XJT","Asia/Kashgar","Asia/Urumqi"], - ["ORAT","Asia/Oral"], - ["GMT+12","Etc/GMT+12"]], - [["UZT","Asia/Samarkand","Asia/Tashkent"], - ["RET","Indian/Reunion"]], - [["CAT","Africa/Blantyre","Africa/Bujumbura", - "Africa/Gaborone","Africa/Harare","Africa/Kigali", - "Africa/Lubumbashi","Africa/Lusaka", - "Africa/Maputo"], - ["QYZT","Asia/Qyzylorda"], - ["FKST","Atlantic/Stanley"]], - [["MIST","Antarctica/Macquarie"], - ["WITA","Asia/Makassar","Asia/Ujung_Pandang"]], - [],[],[],[],[],[],[]}, - {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}). diff --git a/rebar.config b/rebar.config index 0f5d40e..80ecfe8 100644 --- a/rebar.config +++ b/rebar.config @@ -1 +1,5 @@ {erl_opts, [debug_info]}. + +{dialyzer, [ + {warnings, [no_opaque]} +]}. diff --git a/src/ibuild.erl b/src/ibuild.erl deleted file mode 100755 index 2530004..0000000 --- a/src/ibuild.erl +++ /dev/null @@ -1,31 +0,0 @@ -%% @author Dmitry S. Melnikov (dmitryme@gmail.com) -%% @copyright 2010 Dmitry S. Melnikov - --module(ibuild). - --export([build_index/0, main/1]). - --include("tz_database.hrl"). - -build_tzlist(TzName, Name, Dict) -> - case dict:find(Name, Dict) of - error -> - dict:store(Name, [TzName], Dict); - {ok, TzNames} -> - dict:store(Name, TzNames ++ [TzName], Dict) - end. - -build_index() -> - F = fun({TzName,{Name,_},{DName,_},_,_,_,_,_,_}, Acc) -> - NewDict = build_tzlist(TzName, Name, Acc), - build_tzlist(TzName, DName, NewDict); - ({TzName,{Name,_},undef,_,_,_,_,_,_}, Acc) -> - build_tzlist(TzName, Name, Acc) - end, - I = lists:foldl(F, dict:new(), ?tz_database), - {ok, File} = file:open("tz_index.hrl", [write]), - io:fwrite(File, "-define(tz_index, ~p).\n", [I]). - -%% So this can be run from escript: -main(_Args) -> - build_index(). diff --git a/src/localtime.erl b/src/localtime.erl index e989dde..813a9eb 100644 --- a/src/localtime.erl +++ b/src/localtime.erl @@ -6,7 +6,6 @@ -author("Dmitry Melnikov "). -include("tz_database.hrl"). --include("tz_index.hrl"). -export( [ @@ -139,6 +138,7 @@ tz_name(LocalDateTime, Timezone) -> is_not_in_dst -> StdName; ambiguous_time -> + error_logger:info_msg("TZ Name: ~p, ~p",[StdName, DstName]), {StdName, DstName}; time_not_exists -> unable_to_detect @@ -197,7 +197,7 @@ get_timezone(TimeZone) -> get_timezone_inner(TimeZone). list_timezones() -> - dict:fetch_keys(?tz_index). + tz_index:all(). % ======================================================================= % privates @@ -238,11 +238,11 @@ get_timezone_inner(TimeZone) when is_binary(TimeZone) -> get_timezone_inner(erlang:binary_to_list(TimeZone)); get_timezone_inner(TimeZone) when is_list(TimeZone) -> TimeZoneNoSpaces = tr_char(TimeZone, ?SPACE_CHAR, $_), - case dict:find(TimeZoneNoSpaces, ?tz_index) of + case tz_index:lookup(TimeZoneNoSpaces) of error -> - TimeZoneNoSpaces; - {ok, [TZName | _]} -> - TZName + TimeZoneNoSpaces; + [TZName | _] -> + TZName end; get_timezone_inner(TZ) -> throw({error, "Timezone should be string/binary", {provided_timezone, TZ}}). diff --git a/src/tz_index.erl b/src/tz_index.erl new file mode 100644 index 0000000..20c1ff6 --- /dev/null +++ b/src/tz_index.erl @@ -0,0 +1,405 @@ +-module(tz_index). +-export([lookup/1, all/0]). + +lookup("GMT+2") -> ["Etc/GMT+2"]; +lookup("WGST") -> ["America/Godthab"]; +lookup("CCT") -> ["Indian/Cocos"]; +lookup("ACWST") -> ["Australia/Eucla"]; +lookup("NPT") -> ["Asia/Kathmandu","Asia/Katmandu"]; +lookup("HKT") -> ["Asia/Hong_Kong","Hongkong"]; +lookup("AZT") -> ["Asia/Baku"]; +lookup("DAVT") -> ["Antarctica/Davis"]; +lookup("GMT-7") -> ["Etc/GMT-7"]; +lookup("MST") -> ["America/Boise","America/Cambridge_Bay","America/Chihuahua", + "America/Creston","America/Dawson_Creek","America/Denver", + "America/Edmonton","America/Fort_Nelson", + "America/Hermosillo","America/Inuvik","America/Mazatlan", + "America/Ojinaga","America/Phoenix","America/Shiprock", + "America/Yellowknife","Canada/Mountain","MST","MST7MDT", + "Mexico/BajaSur","Navajo","US/Arizona","US/Mountain"]; +lookup("GAMT") -> ["Pacific/Gambier"]; +lookup("GMT-4") -> ["Etc/GMT-4"]; +lookup("GMT-13") -> ["Etc/GMT-13"]; +lookup("ROTT") -> ["Antarctica/Rothera"]; +lookup("GMT-10") -> ["Etc/GMT-10"]; +lookup("GMT-1") -> ["Etc/GMT-1"]; +lookup("SGT") -> ["Asia/Singapore","Singapore"]; +lookup("PWT") -> ["Pacific/Palau"]; +lookup("PHOT") -> ["Pacific/Enderbury"]; +lookup("MSK") -> ["Europe/Minsk","Europe/Moscow","Europe/Simferopol", + "Europe/Volgograd","W-SU"]; +lookup("LHST") -> ["Australia/LHI","Australia/Lord_Howe"]; +lookup("SAKT") -> ["Asia/Sakhalin"]; +lookup("AST") -> ["America/Anguilla","America/Antigua","America/Aruba", + "America/Barbados","America/Blanc-Sablon","America/Curacao", + "America/Dominica","America/Glace_Bay","America/Goose_Bay", + "America/Grand_Turk","America/Grenada","America/Guadeloupe", + "America/Halifax","America/Kralendijk", + "America/Lower_Princes","America/Marigot", + "America/Martinique","America/Moncton","America/Montserrat", + "America/Port_of_Spain","America/Puerto_Rico", + "America/Santo_Domingo","America/St_Barthelemy", + "America/St_Kitts","America/St_Lucia","America/St_Thomas", + "America/St_Vincent","America/Thule","America/Tortola", + "America/Virgin","Asia/Aden","Asia/Baghdad","Asia/Bahrain", + "Asia/Kuwait","Asia/Qatar","Asia/Riyadh","Atlantic/Bermuda", + "Canada/Atlantic"]; +lookup("HDT") -> ["America/Adak","America/Atka","US/Aleutian"]; +lookup("YEKT") -> ["Asia/Yekaterinburg"]; +lookup("NST") -> ["America/St_Johns","Canada/Newfoundland"]; +lookup("CKT") -> ["Pacific/Rarotonga"]; +lookup("GMT+7") -> ["Etc/GMT+7"]; +lookup("BDT") -> ["Asia/Dacca","Asia/Dhaka"]; +lookup("LINT") -> ["Pacific/Kiritimati"]; +lookup("VUT") -> ["Pacific/Efate"]; +lookup("MVT") -> ["Indian/Maldives"]; +lookup("GMT+4") -> ["Etc/GMT+4"]; +lookup("NOVT") -> ["Asia/Novosibirsk"]; +lookup("PKT") -> ["Asia/Karachi"]; +lookup("HST") -> ["America/Adak","America/Atka","HST","Pacific/Honolulu", + "Pacific/Johnston","US/Aleutian","US/Hawaii"]; +lookup("FJT") -> ["Pacific/Fiji"]; +lookup("CHADT") -> ["NZ-CHAT","Pacific/Chatham"]; +lookup("GMT+1") -> ["Etc/GMT+1"]; +lookup("ACDT") -> ["Australia/Adelaide","Australia/Broken_Hill", + "Australia/South","Australia/Yancowinna"]; +lookup("HOVST") -> ["Asia/Hovd"]; +lookup("TLT") -> ["Asia/Dili"]; +lookup("BNT") -> ["Asia/Brunei"]; +lookup("VOST") -> ["Antarctica/Vostok"]; +lookup("ECT") -> ["America/Guayaquil"]; +lookup("WAT") -> ["Africa/Bangui","Africa/Brazzaville","Africa/Douala", + "Africa/Kinshasa","Africa/Lagos","Africa/Libreville", + "Africa/Luanda","Africa/Malabo","Africa/Ndjamena", + "Africa/Niamey","Africa/Porto-Novo","Africa/Windhoek"]; +lookup("WFT") -> ["Pacific/Wallis"]; +lookup("KOST") -> ["Pacific/Kosrae"]; +lookup("BST") -> ["Europe/Belfast","Europe/Guernsey","Europe/Isle_of_Man", + "Europe/Jersey","Europe/London","GB","GB-Eire", + "Pacific/Bougainville"]; +lookup("IDT") -> ["Asia/Jerusalem","Asia/Tel_Aviv","Israel"]; +lookup("EEST") -> ["Asia/Amman","Asia/Beirut","Asia/Damascus","Asia/Gaza", + "Asia/Hebron","Asia/Istanbul","Asia/Nicosia","EET", + "Europe/Athens","Europe/Bucharest","Europe/Chisinau", + "Europe/Helsinki","Europe/Istanbul","Europe/Kiev", + "Europe/Mariehamn","Europe/Nicosia","Europe/Riga", + "Europe/Sofia","Europe/Tallinn","Europe/Tiraspol", + "Europe/Uzhgorod","Europe/Vilnius","Europe/Zaporozhye", + "Turkey"]; +lookup("TVT") -> ["Pacific/Funafuti"]; +lookup("MET") -> ["MET"]; +lookup("GMT-9") -> ["Etc/GMT-9"]; +lookup("AZOT") -> ["Atlantic/Azores"]; +lookup("SRET") -> ["Asia/Srednekolymsk"]; +lookup("CHOT") -> ["Asia/Choibalsan"]; +lookup("ALMT") -> ["Asia/Almaty"]; +lookup("CHAST") -> ["NZ-CHAT","Pacific/Chatham"]; +lookup("GMT-6") -> ["Etc/GMT-6"]; +lookup("ACST") -> ["Australia/Adelaide","Australia/Broken_Hill", + "Australia/Darwin","Australia/North","Australia/South", + "Australia/Yancowinna"]; +lookup("CDT") -> ["America/Bahia_Banderas","America/Chicago","America/Havana", + "America/Indiana/Knox","America/Indiana/Tell_City", + "America/Knox_IN","America/Matamoros","America/Menominee", + "America/Merida","America/Mexico_City","America/Monterrey", + "America/North_Dakota/Beulah","America/North_Dakota/Center", + "America/North_Dakota/New_Salem","America/Rainy_River", + "America/Rankin_Inlet","America/Resolute", + "America/Winnipeg","CST6CDT","Canada/Central","Cuba", + "Mexico/General","US/Central","US/Indiana-Starke"]; +lookup("SAST") -> ["Africa/Johannesburg","Africa/Maseru","Africa/Mbabane"]; +lookup("GMT-3") -> ["Etc/GMT-3"]; +lookup("GMT-12") -> ["Etc/GMT-12"]; +lookup("GET") -> ["Asia/Tbilisi"]; +lookup("IST") -> ["Asia/Calcutta","Asia/Colombo","Asia/Jerusalem", + "Asia/Kolkata","Asia/Tel_Aviv","Eire","Europe/Dublin", + "Israel"]; +lookup("PDT") -> ["America/Dawson","America/Ensenada","America/Los_Angeles", + "America/Santa_Isabel","America/Tijuana", + "America/Vancouver","America/Whitehorse","Canada/Pacific", + "Canada/Yukon","Mexico/BajaNorte","PST8PDT","US/Pacific"]; +lookup("PYST") -> ["America/Asuncion"]; +lookup("GMT+11") -> ["Etc/GMT+11"]; +lookup("PMDT") -> ["America/Miquelon"]; +lookup("SCT") -> ["Indian/Mahe"]; +lookup("MYT") -> ["Asia/Kuala_Lumpur","Asia/Kuching"]; +lookup("KRAT") -> ["Asia/Krasnoyarsk","Asia/Novokuznetsk"]; +lookup("TJT") -> ["Asia/Dushanbe"]; +lookup("CST") -> ["America/Bahia_Banderas","America/Belize","America/Chicago", + "America/Costa_Rica","America/El_Salvador", + "America/Guatemala","America/Havana","America/Indiana/Knox", + "America/Indiana/Tell_City","America/Knox_IN", + "America/Managua","America/Matamoros","America/Menominee", + "America/Merida","America/Mexico_City","America/Monterrey", + "America/North_Dakota/Beulah","America/North_Dakota/Center", + "America/North_Dakota/New_Salem","America/Rainy_River", + "America/Rankin_Inlet","America/Regina","America/Resolute", + "America/Swift_Current","America/Tegucigalpa", + "America/Winnipeg","Asia/Chongqing","Asia/Chungking", + "Asia/Harbin","Asia/Macao","Asia/Macau","Asia/Shanghai", + "Asia/Taipei","CST6CDT","Canada/Central", + "Canada/East-Saskatchewan","Canada/Saskatchewan","Cuba", + "Mexico/General","PRC","ROC","US/Central", + "US/Indiana-Starke"]; +lookup("EAT") -> ["Africa/Addis_Ababa","Africa/Asmara","Africa/Asmera", + "Africa/Dar_es_Salaam","Africa/Djibouti","Africa/Juba", + "Africa/Kampala","Africa/Khartoum","Africa/Mogadishu", + "Africa/Nairobi","Indian/Antananarivo","Indian/Comoro", + "Indian/Mayotte"]; +lookup("TOT") -> ["Pacific/Tongatapu"]; +lookup("CXT") -> ["Indian/Christmas"]; +lookup("VLAT") -> ["Asia/Ust-Nera","Asia/Vladivostok"]; +lookup("SYOT") -> ["Antarctica/Syowa"]; +lookup("AWST") -> ["Antarctica/Casey","Australia/Perth","Australia/West"]; +lookup("PST") -> ["America/Dawson","America/Ensenada","America/Los_Angeles", + "America/Metlakatla","America/Santa_Isabel", + "America/Tijuana","America/Vancouver","America/Whitehorse", + "Canada/Pacific","Canada/Yukon","Mexico/BajaNorte", + "PST8PDT","Pacific/Pitcairn","US/Pacific"]; +lookup("CEST") -> ["Africa/Ceuta","Antarctica/Troll","Arctic/Longyearbyen", + "Atlantic/Jan_Mayen","CET","Europe/Amsterdam", + "Europe/Andorra","Europe/Belgrade","Europe/Berlin", + "Europe/Bratislava","Europe/Brussels","Europe/Budapest", + "Europe/Busingen","Europe/Copenhagen","Europe/Gibraltar", + "Europe/Ljubljana","Europe/Luxembourg","Europe/Madrid", + "Europe/Malta","Europe/Monaco","Europe/Oslo", + "Europe/Paris","Europe/Podgorica","Europe/Prague", + "Europe/Rome","Europe/San_Marino","Europe/Sarajevo", + "Europe/Skopje","Europe/Stockholm","Europe/Tirane", + "Europe/Vaduz","Europe/Vatican","Europe/Vienna", + "Europe/Warsaw","Europe/Zagreb","Europe/Zurich","Poland"]; +lookup("MART") -> ["Pacific/Marquesas"]; +lookup("GMT+9") -> ["Etc/GMT+9"]; +lookup("WIT") -> ["Asia/Jayapura"]; +lookup("UTC") -> ["Antarctica/Troll","Etc/UTC","Etc/Universal","Etc/Zulu", + "UTC","Universal","Zulu"]; +lookup("PMST") -> ["America/Miquelon"]; +lookup("GYT") -> ["America/Guyana"]; +lookup("AKDT") -> ["America/Anchorage","America/Juneau","America/Nome", + "America/Sitka","America/Yakutat","US/Alaska"]; +lookup("MEST") -> ["MET"]; +lookup("MHT") -> ["Kwajalein","Pacific/Kwajalein","Pacific/Majuro"]; +lookup("GMT+6") -> ["Etc/GMT+6"]; +lookup("AZOST") -> ["Atlantic/Azores"]; +lookup("JST") -> ["Asia/Tokyo","Japan"]; +lookup("YAKT") -> ["Asia/Khandyga","Asia/Yakutsk"]; +lookup("CHOST") -> ["Asia/Choibalsan"]; +lookup("MAWT") -> ["Antarctica/Mawson"]; +lookup("SRT") -> ["America/Paramaribo"]; +lookup("GMT+3") -> ["Etc/GMT+3"]; +lookup("AEDT") -> ["Australia/ACT","Australia/Canberra","Australia/Currie", + "Australia/Hobart","Australia/Melbourne","Australia/NSW", + "Australia/Sydney","Australia/Tasmania", + "Australia/Victoria"]; +lookup("ULAT") -> ["Asia/Ulaanbaatar","Asia/Ulan_Bator"]; +lookup("MMT") -> ["Asia/Rangoon"]; +lookup("PGT") -> ["Pacific/Port_Moresby"]; +lookup("OMST") -> ["Asia/Omsk"]; +lookup("EGST") -> ["America/Scoresbysund"]; +lookup("BRST") -> ["America/Sao_Paulo","Brazil/East"]; +lookup("CLT") -> ["America/Santiago","Antarctica/Palmer","Chile/Continental"]; +lookup("AKST") -> ["America/Anchorage","America/Juneau","America/Nome", + "America/Sitka","America/Yakutat","US/Alaska"]; +lookup("WEST") -> ["Africa/Casablanca","Africa/El_Aaiun","Atlantic/Canary", + "Atlantic/Faeroe","Atlantic/Faroe","Atlantic/Madeira", + "Europe/Lisbon","Portugal","WET"]; +lookup("GALT") -> ["Pacific/Galapagos"]; +lookup("NZDT") -> ["Antarctica/McMurdo","Antarctica/South_Pole","NZ", + "Pacific/Auckland"]; +lookup("ACT") -> ["America/Eirunepe","America/Porto_Acre", + "America/Rio_Branco","Brazil/Acre"]; +lookup("GMT") -> ["Africa/Abidjan","Africa/Accra","Africa/Bamako", + "Africa/Banjul","Africa/Bissau","Africa/Conakry", + "Africa/Dakar","Africa/Freetown","Africa/Lome", + "Africa/Monrovia","Africa/Nouakchott","Africa/Ouagadougou", + "Africa/Sao_Tome","Africa/Timbuktu","America/Danmarkshavn", + "Atlantic/Reykjavik","Atlantic/St_Helena","Eire","Etc/GMT", + "Etc/GMT+0","Etc/GMT-0","Etc/GMT0","Etc/Greenwich", + "Europe/Belfast","Europe/Dublin","Europe/Guernsey", + "Europe/Isle_of_Man","Europe/Jersey","Europe/London","GB", + "GB-Eire","GMT","GMT+0","GMT-0","GMT0","Greenwich", + "Iceland"]; +lookup("NCT") -> ["Pacific/Noumea"]; +lookup("GMT-8") -> ["Etc/GMT-8"]; +lookup("EAST") -> ["Chile/EasterIsland","Pacific/Easter"]; +lookup("AEST") -> ["Australia/ACT","Australia/Brisbane","Australia/Canberra", + "Australia/Currie","Australia/Hobart","Australia/Lindeman", + "Australia/Melbourne","Australia/NSW", + "Australia/Queensland","Australia/Sydney", + "Australia/Tasmania","Australia/Victoria"]; +lookup("CVT") -> ["Atlantic/Cape_Verde"]; +lookup("PETT") -> ["Asia/Kamchatka"]; +lookup("TMT") -> ["Asia/Ashgabat","Asia/Ashkhabad"]; +lookup("BOT") -> ["America/La_Paz"]; +lookup("EDT") -> ["America/Cayman","America/Detroit","America/Fort_Wayne", + "America/Indiana/Indianapolis","America/Indiana/Marengo", + "America/Indiana/Petersburg","America/Indiana/Vevay", + "America/Indiana/Vincennes","America/Indiana/Winamac", + "America/Indianapolis","America/Iqaluit", + "America/Kentucky/Louisville","America/Kentucky/Monticello", + "America/Louisville","America/Montreal","America/Nassau", + "America/New_York","America/Nipigon","America/Pangnirtung", + "America/Port-au-Prince","America/Thunder_Bay", + "America/Toronto","Canada/Eastern","EST5EDT", + "US/East-Indiana","US/Eastern","US/Michigan"]; +lookup("WSDT") -> ["Pacific/Apia"]; +lookup("GMT-5") -> ["Etc/GMT-5"]; +lookup("GMT-14") -> ["Etc/GMT-14"]; +lookup("BTT") -> ["Asia/Thimbu","Asia/Thimphu"]; +lookup("KST") -> ["Asia/Pyongyang","Asia/Seoul","ROK"]; +lookup("WIB") -> ["Asia/Jakarta","Asia/Pontianak"]; +lookup("IRKT") -> ["Asia/Chita","Asia/Irkutsk"]; +lookup("UYT") -> ["America/Montevideo"]; +lookup("WGT") -> ["America/Godthab"]; +lookup("AMT") -> ["America/Boa_Vista","America/Campo_Grande","America/Cuiaba", + "America/Manaus","America/Porto_Velho","Asia/Yerevan", + "Brazil/West"]; +lookup("WAKT") -> ["Pacific/Wake"]; +lookup("GMT-2") -> ["Etc/GMT-2"]; +lookup("GMT-11") -> ["Etc/GMT-11"]; +lookup("NZST") -> ["Antarctica/McMurdo","Antarctica/South_Pole","NZ", + "Pacific/Auckland"]; +lookup("VET") -> ["America/Caracas"]; +lookup("ART") -> ["America/Argentina/Buenos_Aires", + "America/Argentina/Catamarca", + "America/Argentina/ComodRivadavia", + "America/Argentina/Cordoba","America/Argentina/Jujuy", + "America/Argentina/La_Rioja","America/Argentina/Mendoza", + "America/Argentina/Rio_Gallegos","America/Argentina/Salta", + "America/Argentina/San_Juan","America/Argentina/San_Luis", + "America/Argentina/Tucuman","America/Argentina/Ushuaia", + "America/Buenos_Aires","America/Catamarca", + "America/Cordoba","America/Jujuy","America/Mendoza", + "America/Rosario"]; +lookup("NRT") -> ["Pacific/Nauru"]; +lookup("CHUT") -> ["Pacific/Chuuk","Pacific/Truk","Pacific/Yap"]; +lookup("IOT") -> ["Indian/Chagos"]; +lookup("UCT") -> ["Etc/UCT","UCT"]; +lookup("GMT+10") -> ["Etc/GMT+10"]; +lookup("ANAT") -> ["Asia/Anadyr"]; +lookup("EST") -> ["America/Atikokan","America/Cancun","America/Cayman", + "America/Coral_Harbour","America/Detroit", + "America/Fort_Wayne","America/Indiana/Indianapolis", + "America/Indiana/Marengo","America/Indiana/Petersburg", + "America/Indiana/Vevay","America/Indiana/Vincennes", + "America/Indiana/Winamac","America/Indianapolis", + "America/Iqaluit","America/Jamaica", + "America/Kentucky/Louisville","America/Kentucky/Monticello", + "America/Louisville","America/Montreal","America/Nassau", + "America/New_York","America/Nipigon","America/Panama", + "America/Pangnirtung","America/Port-au-Prince", + "America/Thunder_Bay","America/Toronto","Canada/Eastern", + "EST","EST5EDT","Jamaica","US/East-Indiana","US/Eastern", + "US/Michigan"]; +lookup("CET") -> ["Africa/Algiers","Africa/Ceuta","Africa/Tunis", + "Arctic/Longyearbyen","Atlantic/Jan_Mayen","CET", + "Europe/Amsterdam","Europe/Andorra","Europe/Belgrade", + "Europe/Berlin","Europe/Bratislava","Europe/Brussels", + "Europe/Budapest","Europe/Busingen","Europe/Copenhagen", + "Europe/Gibraltar","Europe/Ljubljana","Europe/Luxembourg", + "Europe/Madrid","Europe/Malta","Europe/Monaco", + "Europe/Oslo","Europe/Paris","Europe/Podgorica", + "Europe/Prague","Europe/Rome","Europe/San_Marino", + "Europe/Sarajevo","Europe/Skopje","Europe/Stockholm", + "Europe/Tirane","Europe/Vaduz","Europe/Vatican", + "Europe/Vienna","Europe/Warsaw","Europe/Zagreb", + "Europe/Zurich","Poland"]; +lookup("TAHT") -> ["Pacific/Tahiti"]; +lookup("PONT") -> ["Pacific/Pohnpei","Pacific/Ponape"]; +lookup("WSST") -> ["Pacific/Apia"]; +lookup("ULAST") -> ["Asia/Ulaanbaatar","Asia/Ulan_Bator"]; +lookup("HOVT") -> ["Asia/Hovd"]; +lookup("PET") -> ["America/Lima"]; +lookup("GFT") -> ["America/Cayenne"]; +lookup("MUT") -> ["Indian/Mauritius"]; +lookup("TFT") -> ["Indian/Kerguelen"]; +lookup("KGT") -> ["Asia/Bishkek"]; +lookup("COT") -> ["America/Bogota"]; +lookup("TKT") -> ["Pacific/Fakaofo"]; +lookup("GMT+8") -> ["Etc/GMT+8"]; +lookup("IRDT") -> ["Asia/Tehran","Iran"]; +lookup("AFT") -> ["Asia/Kabul"]; +lookup("GILT") -> ["Pacific/Tarawa"]; +lookup("NFT") -> ["Pacific/Norfolk"]; +lookup("GMT+5") -> ["Etc/GMT+5"]; +lookup("ICT") -> ["Asia/Bangkok","Asia/Ho_Chi_Minh","Asia/Phnom_Penh", + "Asia/Saigon","Asia/Vientiane"]; +lookup("EGT") -> ["America/Scoresbysund"]; +lookup("FNT") -> ["America/Noronha","Brazil/DeNoronha"]; +lookup("BRT") -> ["America/Araguaina","America/Bahia","America/Belem", + "America/Fortaleza","America/Maceio","America/Recife", + "America/Santarem","America/Sao_Paulo","Brazil/East"]; +lookup("WET") -> ["Africa/Casablanca","Africa/El_Aaiun","Atlantic/Canary", + "Atlantic/Faeroe","Atlantic/Faroe","Atlantic/Madeira", + "Europe/Lisbon","Portugal","WET"]; +lookup("SAMT") -> ["Europe/Samara"]; +lookup("AMST") -> ["America/Campo_Grande","America/Cuiaba"]; +lookup("MDT") -> ["America/Boise","America/Cambridge_Bay","America/Chihuahua", + "America/Denver","America/Edmonton","America/Inuvik", + "America/Mazatlan","America/Ojinaga","America/Shiprock", + "America/Yellowknife","Canada/Mountain","MST7MDT", + "Mexico/BajaSur","Navajo","US/Mountain"]; +lookup("PYT") -> ["America/Asuncion"]; +lookup("SST") -> ["Pacific/Midway","Pacific/Pago_Pago","Pacific/Samoa", + "US/Samoa"]; +lookup("ChST") -> ["Pacific/Guam","Pacific/Saipan"]; +lookup("IRST") -> ["Asia/Tehran","Iran"]; +lookup("AZST") -> ["Asia/Baku"]; +lookup("AQTT") -> ["Asia/Aqtau","Asia/Aqtobe"]; +lookup("NUT") -> ["Pacific/Niue"]; +lookup("FJST") -> ["Pacific/Fiji"]; +lookup("WAST") -> ["Africa/Windhoek"]; +lookup("LHDT") -> ["Australia/LHI","Australia/Lord_Howe"]; +lookup("PHT") -> ["Asia/Manila"]; +lookup("SBT") -> ["Pacific/Guadalcanal"]; +lookup("MAGT") -> ["Asia/Magadan"]; +lookup("DDUT") -> ["Antarctica/DumontDUrville"]; +lookup("ADT") -> ["America/Glace_Bay","America/Goose_Bay","America/Halifax", + "America/Moncton","America/Thule","Atlantic/Bermuda", + "Canada/Atlantic"]; +lookup("GMT+12") -> ["Etc/GMT+12"]; +lookup("ORAT") -> ["Asia/Oral"]; +lookup("XJT") -> ["Asia/Kashgar","Asia/Urumqi"]; +lookup("GST") -> ["Asia/Dubai","Asia/Muscat","Atlantic/South_Georgia"]; +lookup("NDT") -> ["America/St_Johns","Canada/Newfoundland"]; +lookup("EET") -> ["Africa/Cairo","Africa/Tripoli","Asia/Amman","Asia/Beirut", + "Asia/Damascus","Asia/Gaza","Asia/Hebron","Asia/Istanbul", + "Asia/Nicosia","EET","Egypt","Europe/Athens", + "Europe/Bucharest","Europe/Chisinau","Europe/Helsinki", + "Europe/Istanbul","Europe/Kaliningrad","Europe/Kiev", + "Europe/Mariehamn","Europe/Nicosia","Europe/Riga", + "Europe/Sofia","Europe/Tallinn","Europe/Tiraspol", + "Europe/Uzhgorod","Europe/Vilnius","Europe/Zaporozhye", + "Libya","Turkey"]; +lookup("RET") -> ["Indian/Reunion"]; +lookup("UZT") -> ["Asia/Samarkand","Asia/Tashkent"]; +lookup("FKST") -> ["Atlantic/Stanley"]; +lookup("QYZT") -> ["Asia/Qyzylorda"]; +lookup("CAT") -> ["Africa/Blantyre","Africa/Bujumbura","Africa/Gaborone", + "Africa/Harare","Africa/Kigali","Africa/Lubumbashi", + "Africa/Lusaka","Africa/Maputo"]; +lookup("WITA") -> ["Asia/Makassar","Asia/Ujung_Pandang"]; +lookup("MIST") -> ["Antarctica/Macquarie"]; +lookup(_) -> error. + +all() -> ["GMT+2","WGST","CCT","ACWST","NPT","HKT","AZT","DAVT","GMT-7","MST", + "GAMT","GMT-4","GMT-13","ROTT","GMT-10","GMT-1","SGT","PWT","PHOT", + "MSK","LHST","SAKT","AST","HDT","YEKT","NST","CKT","GMT+7","BDT", + "LINT","VUT","MVT","GMT+4","NOVT","PKT","HST","FJT","CHADT","GMT+1", + "ACDT","HOVST","TLT","BNT","VOST","ECT","WAT","WFT","KOST","BST", + "IDT","EEST","TVT","MET","GMT-9","AZOT","SRET","CHOT","ALMT", + "CHAST","GMT-6","ACST","CDT","SAST","GMT-3","GMT-12","GET","IST", + "PDT","PYST","GMT+11","PMDT","SCT","MYT","KRAT","TJT","CST","EAT", + "TOT","CXT","VLAT","SYOT","AWST","PST","CEST","MART","GMT+9","WIT", + "UTC","PMST","GYT","AKDT","MEST","MHT","GMT+6","AZOST","JST","YAKT", + "CHOST","MAWT","SRT","GMT+3","AEDT","ULAT","MMT","PGT","OMST", + "EGST","BRST","CLT","AKST","WEST","GALT","NZDT","ACT","GMT","NCT", + "GMT-8","EAST","AEST","CVT","PETT","TMT","BOT","EDT","WSDT","GMT-5", + "GMT-14","BTT","KST","WIB","IRKT","UYT","WGT","AMT","WAKT","GMT-2", + "GMT-11","NZST","VET","ART","NRT","CHUT","IOT","UCT","GMT+10", + "ANAT","EST","CET","TAHT","PONT","WSST","ULAST","HOVT","PET","GFT", + "MUT","TFT","KGT","COT","TKT","GMT+8","IRDT","AFT","GILT","NFT", + "GMT+5","ICT","EGT","FNT","BRT","WET","SAMT","AMST","MDT","PYT", + "SST","ChST","IRST","AZST","AQTT","NUT","FJST","WAST","LHDT","PHT", + "SBT","MAGT","DDUT","ADT","GMT+12","ORAT","XJT","GST","NDT","EET", + "RET","UZT","FKST","QYZT","CAT","WITA","MIST"]. \ No newline at end of file