diff --git a/include/tz_index.hrl b/include/tz_index.hrl new file mode 100644 index 0000000..e21752d --- /dev/null +++ b/include/tz_index.hrl @@ -0,0 +1,330 @@ +-define(tz_index, {dict,176,36,64,32,180,108, + {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}, + {{[["WGST","America/Godthab"]], + [["NPT","Asia/Katmandu"],["CCT","Indian/Cocos"]], + [["DAVT","Antarctica/Davis"], + ["AZT","Asia/Baku"], + ["HKT","Asia/Hong_Kong"], + ["IRT","Asia/Tehran"]], + [["MST","America/Boise","America/Cambridge_Bay", + "America/Chihuahua","America/Dawson_Creek", + "America/Denver","America/Edmonton", + "America/Hermosillo","America/Inuvik", + "America/Mazatlan","America/Phoenix", + "America/Shiprock","America/Yellowknife"], + ["YAKST","Asia/Yakutsk"]], + [["ADT","America/Glace_Bay","America/Goose_Bay", + "America/Halifax","Asia/Baghdad", + "Atlantic/Bermuda"], + ["DDUT","Antarctica/DumontDUrville"], + ["KGST","Asia/Bishkek"], + ["MAGT","Asia/Magadan"], + ["GAMT","Pacific/Gambier"], + ["SBT","Pacific/Guadalcanal"]], + [["EET","Africa/Cairo","Africa/Tripoli", + "Asia/Amman","Asia/Beirut","Asia/Damascus", + "Asia/Gaza","Asia/Istanbul","Asia/Nicosia", + "Europe/Athens","Europe/Bucharest", + "Europe/Chisinau","Europe/Helsinki", + "Europe/Istanbul","Europe/Kaliningrad", + "Europe/Kiev","Europe/Minsk","Europe/Nicosia", + "Europe/Riga","Europe/Simferopol","Europe/Sofia", + "Europe/Tallinn","Europe/Uzhgorod", + "Europe/Vilnius","Europe/Zaporozhye"], + ["NDT","America/St_Johns"], + ["GST","Asia/Dubai","Asia/Muscat", + "Atlantic/South_Georgia"], + ["SAKST","Asia/Sakhalin"], + ["SGT","Asia/Singapore"]], + [["SAKT","Asia/Sakhalin"], + ["UZT","Asia/Samarkand","Asia/Tashkent"], + ["GEST","Asia/Tbilisi"], + ["LHST","Australia/Lord_Howe", + "Australia/Lord_Howe"], + ["MSK","Europe/Moscow"], + ["RET","Indian/Reunion"], + ["PHOT","Pacific/Enderbury"], + ["PWT","Pacific/Palau"]], + [["CAT","Africa/Blantyre","Africa/Bujumbura", + "Africa/Gaborone","Africa/Harare","Africa/Kigali", + "Africa/Lubumbashi","Africa/Lusaka", + "Africa/Maputo"], + ["AST","America/Anguilla","America/Antigua", + "America/Aruba","America/Barbados", + "America/Curacao","America/Dominica", + "America/Glace_Bay","America/Goose_Bay", + "America/Grenada","America/Guadeloupe", + "America/Halifax","America/Martinique", + "America/Montserrat","America/Port_of_Spain", + "America/Puerto_Rico","America/Santo_Domingo", + "America/St_Kitts","America/St_Lucia", + "America/St_Thomas","America/St_Vincent", + "America/Thule","America/Tortola","Asia/Aden", + "Asia/Baghdad","Asia/Bahrain","Asia/Kuwait", + "Asia/Qatar","Asia/Riyadh","Atlantic/Bermuda"], + ["PETST","Asia/Kamchatka"], + ["FKST","Atlantic/Stanley"], + ["EASST","Pacific/Easter"]], + [["NST","America/St_Johns"], + ["AQTST","Asia/Aqtau","Asia/Aqtobe"], + ["YEKT","Asia/Yekaterinburg"]], + [["BDT","Asia/Dhaka"], + ["NOVST","Asia/Novosibirsk"], + ["CKT","Pacific/Rarotonga"]], + [["PKT","Asia/Karachi"], + ["NOVT","Asia/Novosibirsk"], + ["MVT","Indian/Maldives"], + ["VUT","Pacific/Efate"], + ["HST","Pacific/Honolulu","Pacific/Johnston"], + ["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"], + ["CHADT","Pacific/Chatham"], + ["FJT","Pacific/Fiji"]], + [["EEST","Africa/Cairo","Asia/Amman","Asia/Beirut", + "Asia/Damascus","Asia/Gaza","Asia/Istanbul", + "Asia/Nicosia","Europe/Athens","Europe/Bucharest", + "Europe/Chisinau","Europe/Helsinki", + "Europe/Istanbul","Europe/Kaliningrad", + "Europe/Kiev","Europe/Minsk","Europe/Nicosia", + "Europe/Riga","Europe/Simferopol","Europe/Sofia", + "Europe/Uzhgorod","Europe/Zaporozhye"], + ["HADT","America/Adak"], + ["IDT","Asia/Jerusalem"], + ["BST","Europe/Belfast","Europe/London"], + ["KOST","Pacific/Kosrae"], + ["WFT","Pacific/Wallis"]], + [["ALMT","Asia/Almaty"], + ["CHOT","Asia/Choibalsan"], + ["AZOT","Atlantic/Azores"], + ["TVT","Pacific/Funafuti"]], + [["SAST","Africa/Johannesburg","Africa/Maseru", + "Africa/Mbabane"], + ["CDT","America/Cancun","America/Chicago", + "America/Havana","America/Menominee", + "America/Merida","America/Mexico_City", + "America/Monterrey","America/North_Dakota/Center", + "America/Rainy_River","America/Rankin_Inlet", + "America/Winnipeg"], + ["CHAST","Pacific/Chatham"]], + [["HAST","America/Adak"], + ["PYST","America/Asuncion"], + ["PDT","America/Dawson","America/Los_Angeles", + "America/Tijuana","America/Vancouver", + "America/Whitehorse"], + ["IST","Asia/Calcutta","Asia/Jerusalem", + "Europe/Dublin"], + ["CIT","Asia/Makassar","Asia/Ujung_Pandang"], + ["GET","Asia/Tbilisi"], + ["SAMST","Europe/Samara"]]}, + {[["PMDT","America/Miquelon"]], + [["EAT","Africa/Addis_Ababa","Africa/Asmera", + "Africa/Dar_es_Salaam","Africa/Djibouti", + "Africa/Kampala","Africa/Khartoum", + "Africa/Mogadishu","Africa/Nairobi", + "Indian/Antananarivo","Indian/Comoro", + "Indian/Mayotte"], + ["CST","America/Belize","America/Cancun", + "America/Chicago","America/Costa_Rica", + "America/El_Salvador","America/Guatemala", + "America/Havana","America/Managua", + "America/Menominee","America/Merida", + "America/Mexico_City","America/Monterrey", + "America/North_Dakota/Center", + "America/Rainy_River","America/Rankin_Inlet", + "America/Regina","America/Swift_Current", + "America/Tegucigalpa","America/Winnipeg", + "Asia/Chongqing","Asia/Harbin","Asia/Kashgar", + "Asia/Macao","Asia/Macau","Asia/Shanghai", + "Asia/Taipei","Asia/Urumqi","Australia/Adelaide", + "Australia/Adelaide","Australia/Broken_Hill", + "Australia/Broken_Hill","Australia/Darwin"], + ["TJT","Asia/Dushanbe"], + ["KRAT","Asia/Krasnoyarsk"], + ["MYT","Asia/Kuala_Lumpur","Asia/Kuching"], + ["VLAST","Asia/Vladivostok"], + ["SCT","Indian/Mahe"]], + [["CEST","Africa/Ceuta","Arctic/Longyearbyen", + "Atlantic/Jan_Mayen","Europe/Amsterdam", + "Europe/Andorra","Europe/Belgrade", + "Europe/Berlin","Europe/Bratislava", + "Europe/Brussels","Europe/Budapest", + "Europe/Copenhagen","Europe/Gibraltar", + "Europe/Ljubljana","Europe/Luxembourg", + "Europe/Madrid","Europe/Malta","Europe/Monaco", + "Europe/Oslo","Europe/Paris","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"], + ["PST","America/Dawson","America/Los_Angeles", + "America/Tijuana","America/Vancouver", + "America/Whitehorse","Pacific/Pitcairn"], + ["SYOT","Antarctica/Syowa"], + ["ANAST","Asia/Anadyr"], + ["VLAT","Asia/Vladivostok"], + ["CXT","Indian/Christmas"], + ["TOT","Pacific/Tongatapu"]], + [["AKDT","America/Anchorage","America/Juneau", + "America/Nome","America/Yakutat"], + ["GYT","America/Guyana"], + ["PMST","America/Miquelon"], + ["WIT","Asia/Jakarta","Asia/Pontianak"], + ["MAGST","Asia/Magadan"], + ["MSD","Europe/Moscow"], + ["MART","Pacific/Marquesas"]], + [["SRT","America/Paramaribo"], + ["MAWT","Antarctica/Mawson"], + ["ALMST","Asia/Almaty"], + ["JST","Asia/Tokyo"], + ["YAKT","Asia/Yakutsk"], + ["AZOST","Atlantic/Azores"], + ["MHT","Pacific/Kwajalein","Pacific/Majuro"]], + [["CLST","America/Santiago","Antarctica/Palmer"], + ["WST","Antarctica/Casey","Asia/Oral", + "Australia/Perth","Pacific/Apia"], + ["OMSST","Asia/Omsk"], + ["MMT","Asia/Rangoon"], + ["ULAT","Asia/Ulaanbaatar"], + ["YAPT","Pacific/Yap"]], + [["AKST","America/Anchorage","America/Juneau", + "America/Nome","America/Yakutat"], + ["BRST","America/Araguaina","America/Fortaleza", + "America/Maceio","America/Recife", + "America/Sao_Paulo"], + ["CLT","America/Santiago","Antarctica/Palmer"], + ["EGST","America/Scoresbysund"], + ["LKT","Asia/Colombo"], + ["OMST","Asia/Omsk"], + ["WEST","Atlantic/Canary","Atlantic/Faeroe", + "Atlantic/Madeira","Europe/Lisbon"], + ["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","Europe/Belfast", + "Europe/Dublin","Europe/London"], + ["ACT","America/Eirunepe","America/Rio_Branco"], + ["NZDT","Antarctica/McMurdo", + "Antarctica/South_Pole","Pacific/Auckland"], + ["YEKST","Asia/Yekaterinburg"], + ["GALT","Pacific/Galapagos"]], + [["EDT","America/Detroit","America/Grand_Turk", + "America/Iqaluit","America/Kentucky/Louisville", + "America/Kentucky/Monticello", + "America/Louisville","America/Montreal", + "America/Nassau","America/New_York", + "America/Nipigon","America/Pangnirtung", + "America/Thunder_Bay"], + ["BOT","America/La_Paz"], + ["TMT","Asia/Ashgabat"], + ["PETT","Asia/Kamchatka"], + ["KRAST","Asia/Krasnoyarsk"], + ["CVT","Atlantic/Cape_Verde"], + ["FKT","Atlantic/Stanley"], + ["EAST","Pacific/Easter"], + ["NCT","Pacific/Noumea"]], + [["AMT","America/Boa_Vista","America/Cuiaba", + "America/Manaus","America/Porto_Velho", + "Asia/Yerevan"], + ["WGT","America/Godthab"], + ["UYT","America/Montevideo"], + ["IRKT","Asia/Irkutsk"], + ["EIT","Asia/Jayapura"], + ["KST","Asia/Pyongyang","Asia/Qyzylorda", + "Asia/Seoul"], + ["BTT","Asia/Thimphu"]], + [["ART","America/Buenos_Aires","America/Catamarca", + "America/Cordoba","America/Jujuy", + "America/Mendoza","America/Rosario"], + ["VET","America/Caracas"], + ["NZST","Antarctica/McMurdo", + "Antarctica/South_Pole","Pacific/Auckland"], + ["TRUT","Pacific/Truk"], + ["WAKT","Pacific/Wake"]], + [["CET","Africa/Algiers","Africa/Ceuta", + "Africa/Tunis","Arctic/Longyearbyen", + "Atlantic/Jan_Mayen","Europe/Amsterdam", + "Europe/Andorra","Europe/Belgrade", + "Europe/Berlin","Europe/Bratislava", + "Europe/Brussels","Europe/Budapest", + "Europe/Copenhagen","Europe/Gibraltar", + "Europe/Ljubljana","Europe/Luxembourg", + "Europe/Madrid","Europe/Malta","Europe/Monaco", + "Europe/Oslo","Europe/Paris","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"], + ["EST","America/Cayman","America/Detroit", + "America/Grand_Turk", + "America/Indiana/Indianapolis", + "America/Indiana/Knox","America/Indiana/Marengo", + "America/Indiana/Vevay","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","Australia/Brisbane", + "Australia/Hobart","Australia/Hobart", + "Australia/Lindeman","Australia/Melbourne", + "Australia/Melbourne","Australia/Sydney", + "Australia/Sydney"], + ["ANAT","Asia/Anadyr"], + ["IOT","Indian/Chagos"], + ["NRT","Pacific/Nauru"]], + [["GFT","America/Cayenne"], + ["PET","America/Lima"], + ["HOVT","Asia/Hovd"], + ["PONT","Pacific/Ponape"], + ["TAHT","Pacific/Tahiti"]], + [["COT","America/Bogota"], + ["KGT","Asia/Bishkek"], + ["TFT","Indian/Kerguelen"], + ["MUT","Indian/Mauritius"]], + [["AFT","Asia/Kabul"],["TKT","Pacific/Fakaofo"]], + [["WET","Africa/Casablanca","Africa/El_Aaiun", + "Atlantic/Canary","Atlantic/Faeroe", + "Atlantic/Madeira","Europe/Lisbon"], + ["BRT","America/Araguaina","America/Belem", + "America/Fortaleza","America/Maceio", + "America/Recife","America/Sao_Paulo"], + ["FNT","America/Noronha"], + ["EGT","America/Scoresbysund"], + ["ICT","Asia/Bangkok","Asia/Phnom_Penh", + "Asia/Saigon","Asia/Vientiane"], + ["TPT","Asia/Dili"], + ["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/Shiprock", + "America/Yellowknife"], + ["AMST","America/Cuiaba","Asia/Yerevan"], + ["IRKST","Asia/Irkutsk"], + ["SAMT","Europe/Samara"]], + [["AQTT","Asia/Aqtau","Asia/Aqtobe"], + ["AZST","Asia/Baku"], + ["ChST","Pacific/Guam","Pacific/Saipan"], + ["SST","Pacific/Midway","Pacific/Pago_Pago"]], + [["WAST","Africa/Windhoek"],["NUT","Pacific/Niue"]], + [["PHT","Asia/Manila"]], + [],[],[],[],[],[],[],[],[],[],[],[]}, + {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}). \ No newline at end of file diff --git a/src/ibuild.erl b/src/ibuild.erl new file mode 100644 index 0000000..ab1f1fa --- /dev/null +++ b/src/ibuild.erl @@ -0,0 +1,24 @@ +-module(ibuild). + +-export([build_index/0]). + +-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).", [I]). diff --git a/src/localtime.erl b/src/localtime.erl index 791abc5..f45a660 100644 --- a/src/localtime.erl +++ b/src/localtime.erl @@ -17,7 +17,8 @@ -author("Dmitry Melnikov "). --include("include/tz_database.hrl"). +-include("tz_database.hrl"). +-include("tz_index.hrl"). -export( [ @@ -34,7 +35,7 @@ % LocalDateTime = DateTime() % ErrDescr = unknown_tz utc_to_local(UtcDateTime, Timezone) -> - case lists:keyfind(Timezone, 1, ?tz_database) of + case lists:keyfind(get_timezone(Timezone), 1, ?tz_database) of false -> {error, unknown_tz}; {_Tz, _, _, Shift, _DstShift, undef, _DstStartTime, undef, _DstEndTime} -> @@ -63,7 +64,7 @@ utc_to_local(UtcDateTime, Timezone) -> % UtcDateTime = DateTime() % ErrDescr = unknown_tz local_to_utc(LocalDateTime, Timezone) -> - case lists:keyfind(Timezone, 1, ?tz_database) of + case lists:keyfind(get_timezone(Timezone), 1, ?tz_database) of false -> {error, unknown_tz}; {_Tz, _, _, Shift, _DstShift, undef, _DstStartTime, undef, _DstEndTime} -> @@ -104,7 +105,7 @@ local_to_local(LocalDateTime, TimezoneFrom, TimezoneTo) -> tz_name(_UtcDateTime, "UTC") -> {"UTC", "UTC"}; tz_name(LocalDateTime, Timezone) -> - case lists:keyfind(Timezone, 1, ?tz_database) of + case lists:keyfind(get_timezone(Timezone), 1, ?tz_database) of false -> {error, unknown_tz}; {_Tz, StdName, undef, _Shift, _DstShift, undef, _DstStartTime, undef, _DstEndTime} -> @@ -133,7 +134,7 @@ tz_name(LocalDateTime, Timezone) -> tz_shift(_UtcDateTime, "UTC") -> 0; tz_shift(LocalDateTime, Timezone) -> - case lists:keyfind(Timezone, 1, ?tz_database) of + case lists:keyfind(get_timezone(Timezone), 1, ?tz_database) of false -> {error, unknown_tz}; {_Tz, _StdName, undef, Shift, _DstShift, undef, _DstStartTime, undef, _DstEndTime} -> @@ -162,3 +163,11 @@ fmt_min(Shift) when Shift < 0 -> {'-', abs(Shift) div 60, abs(Shift) rem 60}; fmt_min(Shift) -> {'+', Shift div 60, Shift rem 60}. + +get_timezone(TimeZone) -> + case dict:find(TimeZone, ?tz_index) of + error -> + TimeZone; + {ok, [TZName | _]} -> + TZName + end.