├── .gitignore ├── CMakeLists.txt ├── Dockerfile ├── zones.h ├── LICENSE ├── Makefile ├── example └── example.c ├── README.md ├── scripts ├── templates │ └── zones.template.c └── gen-tz.py ├── zones.csv ├── zones.json └── zones.c /.gitignore: -------------------------------------------------------------------------------- 1 | example/example 2 | zones.o -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | idf_component_register( 2 | SRCS 3 | "zones.c" 4 | 5 | INCLUDE_DIRS "." 6 | ) -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM archlinux:latest 2 | 3 | ADD scripts . 4 | 5 | RUN pacman -Sy --noconfirm python 6 | 7 | RUN pacman -Syu --noconfirm tzdata 8 | -------------------------------------------------------------------------------- /zones.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | /** 4 | * Looks up the POSIX string corresponding to the given tz database name 5 | * @param[in] name the tz database name for the timezone in question 6 | * @return the POSIX string for the timezone in question 7 | **/ 8 | #ifdef __cplusplus 9 | extern "C" { 10 | #endif 11 | 12 | 13 | const char * micro_tz_db_get_posix_str(const char * name); 14 | 15 | #ifdef __cplusplus 16 | } 17 | #endif -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Jacob Lambert 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | CC=gcc 2 | CFLAGS=-I. 3 | DEPS=zones.h 4 | TAG=posix-tz-db 5 | 6 | .PHONY: all clean example docker 7 | 8 | all: zones.o zones.c zones.json zones.csv 9 | 10 | # `zones.o` intentionally does not depend on making `zones.c`, since `zones.c` requires the 11 | # consistent build environment provided by Docker or the latest Arch Linux, and would only 12 | # actually need an update a few times a year or so. `zones.c` is checked in to source 13 | # control though, so build it when it gets updated, commit it, and you're good. 14 | zones.o: zones.h 15 | $(CC) -c -o zones.o $(CFLAGS) zones.c 16 | 17 | zones.c: docker 18 | docker run -i $(TAG) ./gen-tz.py -e > $@ 19 | 20 | zones.json: docker 21 | docker run -i $(TAG) ./gen-tz.py -j > $@ 22 | 23 | zones.csv: docker 24 | docker run -i $(TAG) ./gen-tz.py -c > $@ 25 | 26 | docker: Dockerfile scripts 27 | docker build . -t $(TAG) 28 | 29 | run-example: example/example 30 | example/example 31 | 32 | example: example/example 33 | 34 | example/example: zones.o example/example.c 35 | gcc -o example/example zones.o $(CFLAGS) example/example.c 36 | 37 | clean: 38 | rm -f zones.o example/example 39 | -------------------------------------------------------------------------------- /example/example.c: -------------------------------------------------------------------------------- 1 | /** @file example.c 2 | * @brief An example usage of this timezone database mapping in an embedded system 3 | * 4 | * @author Jacob Lambert 5 | */ 6 | 7 | #include 8 | #include 9 | #include 10 | #include 11 | 12 | #include "zones.h" 13 | 14 | void print_local_time(const char *name) { 15 | time_t now; 16 | time(&now); 17 | struct tm timeinfo; 18 | char strftime_buf[64]; 19 | 20 | const char * posix_str = micro_tz_db_get_posix_str(name); 21 | 22 | if (posix_str) { 23 | setenv("TZ", posix_str, 1); 24 | tzset(); 25 | 26 | localtime_r(&now, &timeinfo); 27 | strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); 28 | printf("The current date/time in %s is: %s\n", name, strftime_buf); 29 | } else { 30 | printf("%s is not a known timezone!\n", name); 31 | } 32 | } 33 | 34 | int main() { 35 | print_local_time("America/New_York"); 36 | print_local_time("America/Fortaleza"); 37 | print_local_time("America/Bahia"); 38 | print_local_time("America/Bahia_Banderas"); 39 | print_local_time("Asia/Shanghai"); 40 | print_local_time("Europe/Lisbon"); 41 | print_local_time("亚洲/武汉"); 42 | } 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | An embeddable mapping between [IANA Time Zone Database](https://www.iana.org/time-zones) names 2 | (like "America/New_York" and "China/Shanghai") and their equivalent [POSIX `"TZ"` rule descriptions](https://www.freebsd.org/cgi/man.cgi?query=tzset) 3 | (like "EST5EDT,M3.2.0,M11.1." and "CST-8"). 4 | 5 | In this way, more user-friendly names can be used in a timezone-setting API, and 6 | timezone rules can be easily updated with a firmware upgrade. 7 | 8 | ### Usage 9 | 10 | See `example/example.c` for an embedded use case. 11 | 12 | Provide user-facing clients with `zones.json` to have a shared timezone vocabulary with the embedded library. 13 | 14 | ### Build 15 | 16 | Since the build is heavily environment-dependant, the Dockerfile provides a consistent build environment — latest Arch Linux. When the IANA timezone database updates (a few times a year, usually: see the latest version [here](https://www.iana.org/time-zones) and compare to the release name/date), just run `make` in the root directory to rebuild all the "data" build artifacts (`zones.c` etc.). These data build artifacts can be checked in to source control since they change so infrequently. 17 | 18 | If the IANA timezone database hasn't changed, you can just build `zones.o`, which isn't as sensitive to the build environment. 19 | -------------------------------------------------------------------------------- /scripts/templates/zones.template.c: -------------------------------------------------------------------------------- 1 | #include "zones.h" 2 | #include 3 | 4 | typedef struct { 5 | const char *name; 6 | const char *posix_str; 7 | } micro_tz_db_pair; 8 | 9 | //! Declaration goes here! 10 | 11 | static char lower(char start) { 12 | if ('A' <= start && start <= 'Z') { 13 | return start - 'A' + 'a'; 14 | } 15 | return start; 16 | } 17 | 18 | /** 19 | * Basically strcmp, but accounting for spaces that have become underscores 20 | * @param[in] target - the 0-terminated string on the left hand side of the comparison 21 | * @param[in] other - the 0-terminated string on the right hand side of the comparison 22 | * @return > 0 if target comes before other alphabetically, 23 | * ==0 if they're the same, 24 | * < 0 if other comes before target alphabetically 25 | * (we don't expect NULL arguments, but, -1 if either is NULL) 26 | **/ 27 | static int tz_name_cmp(const char * target, const char * other) { 28 | if (!target || !other) { 29 | return -1; 30 | } 31 | 32 | while (*target) { 33 | if (lower(*target) != lower(*other)) { 34 | break; 35 | } 36 | do { 37 | target++; 38 | } while (*target == '_'); 39 | do { 40 | other++; 41 | } while (*other == '_'); 42 | } 43 | 44 | return lower(*target) - lower(*other); 45 | } 46 | 47 | const char *micro_tz_db_get_posix_str(const char *name) { 48 | int lo = 0, hi = sizeof(micro_tz_db_tzs) / sizeof(micro_tz_db_pair); 49 | while (lo < hi) { 50 | int mid = (lo + hi) / 2; 51 | micro_tz_db_pair mid_pair = micro_tz_db_tzs[mid]; 52 | int comparison = tz_name_cmp(name, mid_pair.name); 53 | if (comparison == 0) { 54 | return mid_pair.posix_str; 55 | } else if (comparison < 0) { 56 | hi = mid; 57 | } else { 58 | lo = mid + 1; 59 | } 60 | } 61 | return NULL; 62 | } -------------------------------------------------------------------------------- /scripts/gen-tz.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | import sys 4 | import argparse 5 | import json 6 | import re 7 | 8 | ZONES_DIR = "/usr/share/zoneinfo/" 9 | C_TEMPLATE_DECLARATION = "//! Declaration goes here!" 10 | ZONES = [ 11 | "Africa/Abidjan", 12 | "Africa/Accra", 13 | "Africa/Addis_Ababa", 14 | "Africa/Algiers", 15 | "Africa/Asmara", 16 | "Africa/Bamako", 17 | "Africa/Bangui", 18 | "Africa/Banjul", 19 | "Africa/Bissau", 20 | "Africa/Blantyre", 21 | "Africa/Brazzaville", 22 | "Africa/Bujumbura", 23 | "Africa/Cairo", 24 | "Africa/Casablanca", 25 | "Africa/Ceuta", 26 | "Africa/Conakry", 27 | "Africa/Dakar", 28 | "Africa/Dar_es_Salaam", 29 | "Africa/Djibouti", 30 | "Africa/Douala", 31 | "Africa/El_Aaiun", 32 | "Africa/Freetown", 33 | "Africa/Gaborone", 34 | "Africa/Harare", 35 | "Africa/Johannesburg", 36 | "Africa/Juba", 37 | "Africa/Kampala", 38 | "Africa/Khartoum", 39 | "Africa/Kigali", 40 | "Africa/Kinshasa", 41 | "Africa/Lagos", 42 | "Africa/Libreville", 43 | "Africa/Lome", 44 | "Africa/Luanda", 45 | "Africa/Lubumbashi", 46 | "Africa/Lusaka", 47 | "Africa/Malabo", 48 | "Africa/Maputo", 49 | "Africa/Maseru", 50 | "Africa/Mbabane", 51 | "Africa/Mogadishu", 52 | "Africa/Monrovia", 53 | "Africa/Nairobi", 54 | "Africa/Ndjamena", 55 | "Africa/Niamey", 56 | "Africa/Nouakchott", 57 | "Africa/Ouagadougou", 58 | "Africa/Porto-Novo", 59 | "Africa/Sao_Tome", 60 | "Africa/Tripoli", 61 | "Africa/Tunis", 62 | "Africa/Windhoek", 63 | "America/Adak", 64 | "America/Anchorage", 65 | "America/Anguilla", 66 | "America/Antigua", 67 | "America/Araguaina", 68 | "America/Argentina/Buenos_Aires", 69 | "America/Argentina/Catamarca", 70 | "America/Argentina/Cordoba", 71 | "America/Argentina/Jujuy", 72 | "America/Argentina/La_Rioja", 73 | "America/Argentina/Mendoza", 74 | "America/Argentina/Rio_Gallegos", 75 | "America/Argentina/Salta", 76 | "America/Argentina/San_Juan", 77 | "America/Argentina/San_Luis", 78 | "America/Argentina/Tucuman", 79 | "America/Argentina/Ushuaia", 80 | "America/Aruba", 81 | "America/Asuncion", 82 | "America/Atikokan", 83 | "America/Bahia", 84 | "America/Bahia_Banderas", 85 | "America/Barbados", 86 | "America/Belem", 87 | "America/Belize", 88 | "America/Blanc-Sablon", 89 | "America/Boa_Vista", 90 | "America/Bogota", 91 | "America/Boise", 92 | "America/Cambridge_Bay", 93 | "America/Campo_Grande", 94 | "America/Cancun", 95 | "America/Caracas", 96 | "America/Cayenne", 97 | "America/Cayman", 98 | "America/Chicago", 99 | "America/Chihuahua", 100 | "America/Costa_Rica", 101 | "America/Creston", 102 | "America/Cuiaba", 103 | "America/Curacao", 104 | "America/Danmarkshavn", 105 | "America/Dawson", 106 | "America/Dawson_Creek", 107 | "America/Denver", 108 | "America/Detroit", 109 | "America/Dominica", 110 | "America/Edmonton", 111 | "America/Eirunepe", 112 | "America/El_Salvador", 113 | "America/Fortaleza", 114 | "America/Fort_Nelson", 115 | "America/Glace_Bay", 116 | "America/Godthab", 117 | "America/Goose_Bay", 118 | "America/Grand_Turk", 119 | "America/Grenada", 120 | "America/Guadeloupe", 121 | "America/Guatemala", 122 | "America/Guayaquil", 123 | "America/Guyana", 124 | "America/Halifax", 125 | "America/Havana", 126 | "America/Hermosillo", 127 | "America/Indiana/Indianapolis", 128 | "America/Indiana/Knox", 129 | "America/Indiana/Marengo", 130 | "America/Indiana/Petersburg", 131 | "America/Indiana/Tell_City", 132 | "America/Indiana/Vevay", 133 | "America/Indiana/Vincennes", 134 | "America/Indiana/Winamac", 135 | "America/Inuvik", 136 | "America/Iqaluit", 137 | "America/Jamaica", 138 | "America/Juneau", 139 | "America/Kentucky/Louisville", 140 | "America/Kentucky/Monticello", 141 | "America/Kralendijk", 142 | "America/La_Paz", 143 | "America/Lima", 144 | "America/Los_Angeles", 145 | "America/Lower_Princes", 146 | "America/Maceio", 147 | "America/Managua", 148 | "America/Manaus", 149 | "America/Marigot", 150 | "America/Martinique", 151 | "America/Matamoros", 152 | "America/Mazatlan", 153 | "America/Menominee", 154 | "America/Merida", 155 | "America/Metlakatla", 156 | "America/Mexico_City", 157 | "America/Miquelon", 158 | "America/Moncton", 159 | "America/Monterrey", 160 | "America/Montevideo", 161 | "America/Montreal", 162 | "America/Montserrat", 163 | "America/Nassau", 164 | "America/New_York", 165 | "America/Nipigon", 166 | "America/Nome", 167 | "America/Noronha", 168 | "America/North_Dakota/Beulah", 169 | "America/North_Dakota/Center", 170 | "America/North_Dakota/New_Salem", 171 | "America/Ojinaga", 172 | "America/Panama", 173 | "America/Pangnirtung", 174 | "America/Paramaribo", 175 | "America/Phoenix", 176 | "America/Port-au-Prince", 177 | "America/Port_of_Spain", 178 | "America/Porto_Velho", 179 | "America/Puerto_Rico", 180 | "America/Punta_Arenas", 181 | "America/Rainy_River", 182 | "America/Rankin_Inlet", 183 | "America/Recife", 184 | "America/Regina", 185 | "America/Resolute", 186 | "America/Rio_Branco", 187 | "America/Santarem", 188 | "America/Santiago", 189 | "America/Santo_Domingo", 190 | "America/Sao_Paulo", 191 | "America/Scoresbysund", 192 | "America/Sitka", 193 | "America/St_Barthelemy", 194 | "America/St_Johns", 195 | "America/St_Kitts", 196 | "America/St_Lucia", 197 | "America/St_Thomas", 198 | "America/St_Vincent", 199 | "America/Swift_Current", 200 | "America/Tegucigalpa", 201 | "America/Thule", 202 | "America/Thunder_Bay", 203 | "America/Tijuana", 204 | "America/Toronto", 205 | "America/Tortola", 206 | "America/Vancouver", 207 | "America/Whitehorse", 208 | "America/Winnipeg", 209 | "America/Yakutat", 210 | "America/Yellowknife", 211 | "Antarctica/Casey", 212 | "Antarctica/Davis", 213 | "Antarctica/DumontDUrville", 214 | "Antarctica/Macquarie", 215 | "Antarctica/Mawson", 216 | "Antarctica/McMurdo", 217 | "Antarctica/Palmer", 218 | "Antarctica/Rothera", 219 | "Antarctica/Syowa", 220 | "Antarctica/Troll", 221 | "Antarctica/Vostok", 222 | "Arctic/Longyearbyen", 223 | "Asia/Aden", 224 | "Asia/Almaty", 225 | "Asia/Amman", 226 | "Asia/Anadyr", 227 | "Asia/Aqtau", 228 | "Asia/Aqtobe", 229 | "Asia/Ashgabat", 230 | "Asia/Atyrau", 231 | "Asia/Baghdad", 232 | "Asia/Bahrain", 233 | "Asia/Baku", 234 | "Asia/Bangkok", 235 | "Asia/Barnaul", 236 | "Asia/Beirut", 237 | "Asia/Bishkek", 238 | "Asia/Brunei", 239 | "Asia/Chita", 240 | "Asia/Choibalsan", 241 | "Asia/Colombo", 242 | "Asia/Damascus", 243 | "Asia/Dhaka", 244 | "Asia/Dili", 245 | "Asia/Dubai", 246 | "Asia/Dushanbe", 247 | "Asia/Famagusta", 248 | "Asia/Gaza", 249 | "Asia/Hebron", 250 | "Asia/Ho_Chi_Minh", 251 | "Asia/Hong_Kong", 252 | "Asia/Hovd", 253 | "Asia/Irkutsk", 254 | "Asia/Jakarta", 255 | "Asia/Jayapura", 256 | "Asia/Jerusalem", 257 | "Asia/Kabul", 258 | "Asia/Kamchatka", 259 | "Asia/Karachi", 260 | "Asia/Kathmandu", 261 | "Asia/Khandyga", 262 | "Asia/Kolkata", 263 | "Asia/Krasnoyarsk", 264 | "Asia/Kuala_Lumpur", 265 | "Asia/Kuching", 266 | "Asia/Kuwait", 267 | "Asia/Macau", 268 | "Asia/Magadan", 269 | "Asia/Makassar", 270 | "Asia/Manila", 271 | "Asia/Muscat", 272 | "Asia/Nicosia", 273 | "Asia/Novokuznetsk", 274 | "Asia/Novosibirsk", 275 | "Asia/Omsk", 276 | "Asia/Oral", 277 | "Asia/Phnom_Penh", 278 | "Asia/Pontianak", 279 | "Asia/Pyongyang", 280 | "Asia/Qatar", 281 | "Asia/Qyzylorda", 282 | "Asia/Riyadh", 283 | "Asia/Sakhalin", 284 | "Asia/Samarkand", 285 | "Asia/Seoul", 286 | "Asia/Shanghai", 287 | "Asia/Singapore", 288 | "Asia/Srednekolymsk", 289 | "Asia/Taipei", 290 | "Asia/Tashkent", 291 | "Asia/Tbilisi", 292 | "Asia/Tehran", 293 | "Asia/Thimphu", 294 | "Asia/Tokyo", 295 | "Asia/Tomsk", 296 | "Asia/Ulaanbaatar", 297 | "Asia/Urumqi", 298 | "Asia/Ust-Nera", 299 | "Asia/Vientiane", 300 | "Asia/Vladivostok", 301 | "Asia/Yakutsk", 302 | "Asia/Yangon", 303 | "Asia/Yekaterinburg", 304 | "Asia/Yerevan", 305 | "Atlantic/Azores", 306 | "Atlantic/Bermuda", 307 | "Atlantic/Canary", 308 | "Atlantic/Cape_Verde", 309 | "Atlantic/Faroe", 310 | "Atlantic/Madeira", 311 | "Atlantic/Reykjavik", 312 | "Atlantic/South_Georgia", 313 | "Atlantic/Stanley", 314 | "Atlantic/St_Helena", 315 | "Australia/Adelaide", 316 | "Australia/Brisbane", 317 | "Australia/Broken_Hill", 318 | "Australia/Currie", 319 | "Australia/Darwin", 320 | "Australia/Eucla", 321 | "Australia/Hobart", 322 | "Australia/Lindeman", 323 | "Australia/Lord_Howe", 324 | "Australia/Melbourne", 325 | "Australia/Perth", 326 | "Australia/Sydney", 327 | "Europe/Amsterdam", 328 | "Europe/Andorra", 329 | "Europe/Astrakhan", 330 | "Europe/Athens", 331 | "Europe/Belgrade", 332 | "Europe/Berlin", 333 | "Europe/Bratislava", 334 | "Europe/Brussels", 335 | "Europe/Bucharest", 336 | "Europe/Budapest", 337 | "Europe/Busingen", 338 | "Europe/Chisinau", 339 | "Europe/Copenhagen", 340 | "Europe/Dublin", 341 | "Europe/Gibraltar", 342 | "Europe/Guernsey", 343 | "Europe/Helsinki", 344 | "Europe/Isle_of_Man", 345 | "Europe/Istanbul", 346 | "Europe/Jersey", 347 | "Europe/Kaliningrad", 348 | "Europe/Kiev", 349 | "Europe/Kirov", 350 | "Europe/Lisbon", 351 | "Europe/Ljubljana", 352 | "Europe/London", 353 | "Europe/Luxembourg", 354 | "Europe/Madrid", 355 | "Europe/Malta", 356 | "Europe/Mariehamn", 357 | "Europe/Minsk", 358 | "Europe/Monaco", 359 | "Europe/Moscow", 360 | "Europe/Oslo", 361 | "Europe/Paris", 362 | "Europe/Podgorica", 363 | "Europe/Prague", 364 | "Europe/Riga", 365 | "Europe/Rome", 366 | "Europe/Samara", 367 | "Europe/San_Marino", 368 | "Europe/Sarajevo", 369 | "Europe/Saratov", 370 | "Europe/Simferopol", 371 | "Europe/Skopje", 372 | "Europe/Sofia", 373 | "Europe/Stockholm", 374 | "Europe/Tallinn", 375 | "Europe/Tirane", 376 | "Europe/Ulyanovsk", 377 | "Europe/Uzhgorod", 378 | "Europe/Vaduz", 379 | "Europe/Vatican", 380 | "Europe/Vienna", 381 | "Europe/Vilnius", 382 | "Europe/Volgograd", 383 | "Europe/Warsaw", 384 | "Europe/Zagreb", 385 | "Europe/Zaporozhye", 386 | "Europe/Zurich", 387 | "Indian/Antananarivo", 388 | "Indian/Chagos", 389 | "Indian/Christmas", 390 | "Indian/Cocos", 391 | "Indian/Comoro", 392 | "Indian/Kerguelen", 393 | "Indian/Mahe", 394 | "Indian/Maldives", 395 | "Indian/Mauritius", 396 | "Indian/Mayotte", 397 | "Indian/Reunion", 398 | "Pacific/Apia", 399 | "Pacific/Auckland", 400 | "Pacific/Bougainville", 401 | "Pacific/Chatham", 402 | "Pacific/Chuuk", 403 | "Pacific/Easter", 404 | "Pacific/Efate", 405 | "Pacific/Enderbury", 406 | "Pacific/Fakaofo", 407 | "Pacific/Fiji", 408 | "Pacific/Funafuti", 409 | "Pacific/Galapagos", 410 | "Pacific/Gambier", 411 | "Pacific/Guadalcanal", 412 | "Pacific/Guam", 413 | "Pacific/Honolulu", 414 | "Pacific/Kiritimati", 415 | "Pacific/Kosrae", 416 | "Pacific/Kwajalein", 417 | "Pacific/Majuro", 418 | "Pacific/Marquesas", 419 | "Pacific/Midway", 420 | "Pacific/Nauru", 421 | "Pacific/Niue", 422 | "Pacific/Norfolk", 423 | "Pacific/Noumea", 424 | "Pacific/Pago_Pago", 425 | "Pacific/Palau", 426 | "Pacific/Pitcairn", 427 | "Pacific/Pohnpei", 428 | "Pacific/Port_Moresby", 429 | "Pacific/Rarotonga", 430 | "Pacific/Saipan", 431 | "Pacific/Tahiti", 432 | "Pacific/Tarawa", 433 | "Pacific/Tongatapu", 434 | "Pacific/Wake", 435 | "Pacific/Wallis", 436 | ] 437 | 438 | 439 | def get_tz_string(timezone): 440 | data = open(ZONES_DIR + timezone, "rb").read().split(b"\n")[-2] 441 | return data.decode("utf-8") 442 | 443 | 444 | def make_timezones_dict(): 445 | result = {} 446 | for timezone in ZONES: 447 | timezone = timezone.strip() 448 | result[timezone] = get_tz_string(timezone) 449 | return result 450 | 451 | 452 | def print_csv(timezones_dict): 453 | for name, tz in timezones_dict.items(): 454 | print('"{}","{}"'.format(name, tz)) 455 | 456 | 457 | def print_json(timezones_dict): 458 | json.dump( 459 | timezones_dict, sys.stdout, indent=0, sort_keys=True, separators=(",", ":") 460 | ) 461 | 462 | 463 | def print_embedded(timezones_dict): 464 | pairs = [ 465 | '\n {"%s", "%s"}' % (name, posix_str) 466 | for name, posix_str in timezones_dict.items() 467 | ] 468 | declaration = "static const micro_tz_db_pair micro_tz_db_tzs[%s] = {%s\n};" % ( 469 | len(pairs), 470 | ",".join(pairs), 471 | ) 472 | with open("templates/zones.template.c") as template: 473 | template_c = template.read() 474 | print(template_c.replace(C_TEMPLATE_DECLARATION, declaration)) 475 | 476 | 477 | if __name__ == "__main__": 478 | parser = argparse.ArgumentParser( 479 | description="Generates POSIX timezones strings reading data from " + ZONES_DIR 480 | ) 481 | group = parser.add_mutually_exclusive_group(required=True) 482 | group.add_argument("-j", "--json", action="store_true", help="outputs JSON") 483 | group.add_argument("-c", "--csv", action="store_true", help="outputs CSV") 484 | group.add_argument("-e", "--embedded", action="store_true", help="outputs C") 485 | data = parser.parse_args() 486 | 487 | timezones = make_timezones_dict() 488 | 489 | if data.json: 490 | print_json(timezones) 491 | elif data.csv: 492 | print_csv(timezones) 493 | elif data.embedded: 494 | print_embedded(timezones) 495 | -------------------------------------------------------------------------------- /zones.csv: -------------------------------------------------------------------------------- 1 | "Africa/Abidjan","GMT0" 2 | "Africa/Accra","GMT0" 3 | "Africa/Addis_Ababa","EAT-3" 4 | "Africa/Algiers","CET-1" 5 | "Africa/Asmara","EAT-3" 6 | "Africa/Bamako","GMT0" 7 | "Africa/Bangui","WAT-1" 8 | "Africa/Banjul","GMT0" 9 | "Africa/Bissau","GMT0" 10 | "Africa/Blantyre","CAT-2" 11 | "Africa/Brazzaville","WAT-1" 12 | "Africa/Bujumbura","CAT-2" 13 | "Africa/Cairo","EET-2EEST,M4.5.5/0,M10.5.4/24" 14 | "Africa/Casablanca","<+01>-1" 15 | "Africa/Ceuta","CET-1CEST,M3.5.0,M10.5.0/3" 16 | "Africa/Conakry","GMT0" 17 | "Africa/Dakar","GMT0" 18 | "Africa/Dar_es_Salaam","EAT-3" 19 | "Africa/Djibouti","EAT-3" 20 | "Africa/Douala","WAT-1" 21 | "Africa/El_Aaiun","<+01>-1" 22 | "Africa/Freetown","GMT0" 23 | "Africa/Gaborone","CAT-2" 24 | "Africa/Harare","CAT-2" 25 | "Africa/Johannesburg","SAST-2" 26 | "Africa/Juba","CAT-2" 27 | "Africa/Kampala","EAT-3" 28 | "Africa/Khartoum","CAT-2" 29 | "Africa/Kigali","CAT-2" 30 | "Africa/Kinshasa","WAT-1" 31 | "Africa/Lagos","WAT-1" 32 | "Africa/Libreville","WAT-1" 33 | "Africa/Lome","GMT0" 34 | "Africa/Luanda","WAT-1" 35 | "Africa/Lubumbashi","CAT-2" 36 | "Africa/Lusaka","CAT-2" 37 | "Africa/Malabo","WAT-1" 38 | "Africa/Maputo","CAT-2" 39 | "Africa/Maseru","SAST-2" 40 | "Africa/Mbabane","SAST-2" 41 | "Africa/Mogadishu","EAT-3" 42 | "Africa/Monrovia","GMT0" 43 | "Africa/Nairobi","EAT-3" 44 | "Africa/Ndjamena","WAT-1" 45 | "Africa/Niamey","WAT-1" 46 | "Africa/Nouakchott","GMT0" 47 | "Africa/Ouagadougou","GMT0" 48 | "Africa/Porto-Novo","WAT-1" 49 | "Africa/Sao_Tome","GMT0" 50 | "Africa/Tripoli","EET-2" 51 | "Africa/Tunis","CET-1" 52 | "Africa/Windhoek","CAT-2" 53 | "America/Adak","HST10HDT,M3.2.0,M11.1.0" 54 | "America/Anchorage","AKST9AKDT,M3.2.0,M11.1.0" 55 | "America/Anguilla","AST4" 56 | "America/Antigua","AST4" 57 | "America/Araguaina","<-03>3" 58 | "America/Argentina/Buenos_Aires","<-03>3" 59 | "America/Argentina/Catamarca","<-03>3" 60 | "America/Argentina/Cordoba","<-03>3" 61 | "America/Argentina/Jujuy","<-03>3" 62 | "America/Argentina/La_Rioja","<-03>3" 63 | "America/Argentina/Mendoza","<-03>3" 64 | "America/Argentina/Rio_Gallegos","<-03>3" 65 | "America/Argentina/Salta","<-03>3" 66 | "America/Argentina/San_Juan","<-03>3" 67 | "America/Argentina/San_Luis","<-03>3" 68 | "America/Argentina/Tucuman","<-03>3" 69 | "America/Argentina/Ushuaia","<-03>3" 70 | "America/Aruba","AST4" 71 | "America/Asuncion","<-04>4<-03>,M10.1.0/0,M3.4.0/0" 72 | "America/Atikokan","EST5" 73 | "America/Bahia","<-03>3" 74 | "America/Bahia_Banderas","CST6" 75 | "America/Barbados","AST4" 76 | "America/Belem","<-03>3" 77 | "America/Belize","CST6" 78 | "America/Blanc-Sablon","AST4" 79 | "America/Boa_Vista","<-04>4" 80 | "America/Bogota","<-05>5" 81 | "America/Boise","MST7MDT,M3.2.0,M11.1.0" 82 | "America/Cambridge_Bay","MST7MDT,M3.2.0,M11.1.0" 83 | "America/Campo_Grande","<-04>4" 84 | "America/Cancun","EST5" 85 | "America/Caracas","<-04>4" 86 | "America/Cayenne","<-03>3" 87 | "America/Cayman","EST5" 88 | "America/Chicago","CST6CDT,M3.2.0,M11.1.0" 89 | "America/Chihuahua","CST6" 90 | "America/Costa_Rica","CST6" 91 | "America/Creston","MST7" 92 | "America/Cuiaba","<-04>4" 93 | "America/Curacao","AST4" 94 | "America/Danmarkshavn","GMT0" 95 | "America/Dawson","MST7" 96 | "America/Dawson_Creek","MST7" 97 | "America/Denver","MST7MDT,M3.2.0,M11.1.0" 98 | "America/Detroit","EST5EDT,M3.2.0,M11.1.0" 99 | "America/Dominica","AST4" 100 | "America/Edmonton","MST7MDT,M3.2.0,M11.1.0" 101 | "America/Eirunepe","<-05>5" 102 | "America/El_Salvador","CST6" 103 | "America/Fortaleza","<-03>3" 104 | "America/Fort_Nelson","MST7" 105 | "America/Glace_Bay","AST4ADT,M3.2.0,M11.1.0" 106 | "America/Godthab","<-02>2<-01>,M3.5.0/-1,M10.5.0/0" 107 | "America/Goose_Bay","AST4ADT,M3.2.0,M11.1.0" 108 | "America/Grand_Turk","EST5EDT,M3.2.0,M11.1.0" 109 | "America/Grenada","AST4" 110 | "America/Guadeloupe","AST4" 111 | "America/Guatemala","CST6" 112 | "America/Guayaquil","<-05>5" 113 | "America/Guyana","<-04>4" 114 | "America/Halifax","AST4ADT,M3.2.0,M11.1.0" 115 | "America/Havana","CST5CDT,M3.2.0/0,M11.1.0/1" 116 | "America/Hermosillo","MST7" 117 | "America/Indiana/Indianapolis","EST5EDT,M3.2.0,M11.1.0" 118 | "America/Indiana/Knox","CST6CDT,M3.2.0,M11.1.0" 119 | "America/Indiana/Marengo","EST5EDT,M3.2.0,M11.1.0" 120 | "America/Indiana/Petersburg","EST5EDT,M3.2.0,M11.1.0" 121 | "America/Indiana/Tell_City","CST6CDT,M3.2.0,M11.1.0" 122 | "America/Indiana/Vevay","EST5EDT,M3.2.0,M11.1.0" 123 | "America/Indiana/Vincennes","EST5EDT,M3.2.0,M11.1.0" 124 | "America/Indiana/Winamac","EST5EDT,M3.2.0,M11.1.0" 125 | "America/Inuvik","MST7MDT,M3.2.0,M11.1.0" 126 | "America/Iqaluit","EST5EDT,M3.2.0,M11.1.0" 127 | "America/Jamaica","EST5" 128 | "America/Juneau","AKST9AKDT,M3.2.0,M11.1.0" 129 | "America/Kentucky/Louisville","EST5EDT,M3.2.0,M11.1.0" 130 | "America/Kentucky/Monticello","EST5EDT,M3.2.0,M11.1.0" 131 | "America/Kralendijk","AST4" 132 | "America/La_Paz","<-04>4" 133 | "America/Lima","<-05>5" 134 | "America/Los_Angeles","PST8PDT,M3.2.0,M11.1.0" 135 | "America/Lower_Princes","AST4" 136 | "America/Maceio","<-03>3" 137 | "America/Managua","CST6" 138 | "America/Manaus","<-04>4" 139 | "America/Marigot","AST4" 140 | "America/Martinique","AST4" 141 | "America/Matamoros","CST6CDT,M3.2.0,M11.1.0" 142 | "America/Mazatlan","MST7" 143 | "America/Menominee","CST6CDT,M3.2.0,M11.1.0" 144 | "America/Merida","CST6" 145 | "America/Metlakatla","AKST9AKDT,M3.2.0,M11.1.0" 146 | "America/Mexico_City","CST6" 147 | "America/Miquelon","<-03>3<-02>,M3.2.0,M11.1.0" 148 | "America/Moncton","AST4ADT,M3.2.0,M11.1.0" 149 | "America/Monterrey","CST6" 150 | "America/Montevideo","<-03>3" 151 | "America/Montreal","EST5EDT,M3.2.0,M11.1.0" 152 | "America/Montserrat","AST4" 153 | "America/Nassau","EST5EDT,M3.2.0,M11.1.0" 154 | "America/New_York","EST5EDT,M3.2.0,M11.1.0" 155 | "America/Nipigon","EST5EDT,M3.2.0,M11.1.0" 156 | "America/Nome","AKST9AKDT,M3.2.0,M11.1.0" 157 | "America/Noronha","<-02>2" 158 | "America/North_Dakota/Beulah","CST6CDT,M3.2.0,M11.1.0" 159 | "America/North_Dakota/Center","CST6CDT,M3.2.0,M11.1.0" 160 | "America/North_Dakota/New_Salem","CST6CDT,M3.2.0,M11.1.0" 161 | "America/Ojinaga","CST6CDT,M3.2.0,M11.1.0" 162 | "America/Panama","EST5" 163 | "America/Pangnirtung","EST5EDT,M3.2.0,M11.1.0" 164 | "America/Paramaribo","<-03>3" 165 | "America/Phoenix","MST7" 166 | "America/Port-au-Prince","EST5EDT,M3.2.0,M11.1.0" 167 | "America/Port_of_Spain","AST4" 168 | "America/Porto_Velho","<-04>4" 169 | "America/Puerto_Rico","AST4" 170 | "America/Punta_Arenas","<-03>3" 171 | "America/Rainy_River","CST6CDT,M3.2.0,M11.1.0" 172 | "America/Rankin_Inlet","CST6CDT,M3.2.0,M11.1.0" 173 | "America/Recife","<-03>3" 174 | "America/Regina","CST6" 175 | "America/Resolute","CST6CDT,M3.2.0,M11.1.0" 176 | "America/Rio_Branco","<-05>5" 177 | "America/Santarem","<-03>3" 178 | "America/Santiago","<-04>4<-03>,M9.1.6/24,M4.1.6/24" 179 | "America/Santo_Domingo","AST4" 180 | "America/Sao_Paulo","<-03>3" 181 | "America/Scoresbysund","<-01>1<+00>,M3.5.0/0,M10.5.0/1" 182 | "America/Sitka","AKST9AKDT,M3.2.0,M11.1.0" 183 | "America/St_Barthelemy","AST4" 184 | "America/St_Johns","NST3:30NDT,M3.2.0,M11.1.0" 185 | "America/St_Kitts","AST4" 186 | "America/St_Lucia","AST4" 187 | "America/St_Thomas","AST4" 188 | "America/St_Vincent","AST4" 189 | "America/Swift_Current","CST6" 190 | "America/Tegucigalpa","CST6" 191 | "America/Thule","AST4ADT,M3.2.0,M11.1.0" 192 | "America/Thunder_Bay","EST5EDT,M3.2.0,M11.1.0" 193 | "America/Tijuana","PST8PDT,M3.2.0,M11.1.0" 194 | "America/Toronto","EST5EDT,M3.2.0,M11.1.0" 195 | "America/Tortola","AST4" 196 | "America/Vancouver","PST8PDT,M3.2.0,M11.1.0" 197 | "America/Whitehorse","MST7" 198 | "America/Winnipeg","CST6CDT,M3.2.0,M11.1.0" 199 | "America/Yakutat","AKST9AKDT,M3.2.0,M11.1.0" 200 | "America/Yellowknife","MST7MDT,M3.2.0,M11.1.0" 201 | "Antarctica/Casey","<+11>-11" 202 | "Antarctica/Davis","<+07>-7" 203 | "Antarctica/DumontDUrville","<+10>-10" 204 | "Antarctica/Macquarie","AEST-10AEDT,M10.1.0,M4.1.0/3" 205 | "Antarctica/Mawson","<+05>-5" 206 | "Antarctica/McMurdo","NZST-12NZDT,M9.5.0,M4.1.0/3" 207 | "Antarctica/Palmer","<-03>3" 208 | "Antarctica/Rothera","<-03>3" 209 | "Antarctica/Syowa","<+03>-3" 210 | "Antarctica/Troll","<+00>0<+02>-2,M3.5.0/1,M10.5.0/3" 211 | "Antarctica/Vostok","<+06>-6" 212 | "Arctic/Longyearbyen","CET-1CEST,M3.5.0,M10.5.0/3" 213 | "Asia/Aden","<+03>-3" 214 | "Asia/Almaty","<+06>-6" 215 | "Asia/Amman","<+03>-3" 216 | "Asia/Anadyr","<+12>-12" 217 | "Asia/Aqtau","<+05>-5" 218 | "Asia/Aqtobe","<+05>-5" 219 | "Asia/Ashgabat","<+05>-5" 220 | "Asia/Atyrau","<+05>-5" 221 | "Asia/Baghdad","<+03>-3" 222 | "Asia/Bahrain","<+03>-3" 223 | "Asia/Baku","<+04>-4" 224 | "Asia/Bangkok","<+07>-7" 225 | "Asia/Barnaul","<+07>-7" 226 | "Asia/Beirut","EET-2EEST,M3.5.0/0,M10.5.0/0" 227 | "Asia/Bishkek","<+06>-6" 228 | "Asia/Brunei","<+08>-8" 229 | "Asia/Chita","<+09>-9" 230 | "Asia/Choibalsan","<+08>-8" 231 | "Asia/Colombo","<+0530>-5:30" 232 | "Asia/Damascus","<+03>-3" 233 | "Asia/Dhaka","<+06>-6" 234 | "Asia/Dili","<+09>-9" 235 | "Asia/Dubai","<+04>-4" 236 | "Asia/Dushanbe","<+05>-5" 237 | "Asia/Famagusta","EET-2EEST,M3.5.0/3,M10.5.0/4" 238 | "Asia/Gaza","EET-2EEST,M3.4.4/50,M10.4.4/50" 239 | "Asia/Hebron","EET-2EEST,M3.4.4/50,M10.4.4/50" 240 | "Asia/Ho_Chi_Minh","<+07>-7" 241 | "Asia/Hong_Kong","HKT-8" 242 | "Asia/Hovd","<+07>-7" 243 | "Asia/Irkutsk","<+08>-8" 244 | "Asia/Jakarta","WIB-7" 245 | "Asia/Jayapura","WIT-9" 246 | "Asia/Jerusalem","IST-2IDT,M3.4.4/26,M10.5.0" 247 | "Asia/Kabul","<+0430>-4:30" 248 | "Asia/Kamchatka","<+12>-12" 249 | "Asia/Karachi","PKT-5" 250 | "Asia/Kathmandu","<+0545>-5:45" 251 | "Asia/Khandyga","<+09>-9" 252 | "Asia/Kolkata","IST-5:30" 253 | "Asia/Krasnoyarsk","<+07>-7" 254 | "Asia/Kuala_Lumpur","<+08>-8" 255 | "Asia/Kuching","<+08>-8" 256 | "Asia/Kuwait","<+03>-3" 257 | "Asia/Macau","CST-8" 258 | "Asia/Magadan","<+11>-11" 259 | "Asia/Makassar","WITA-8" 260 | "Asia/Manila","PST-8" 261 | "Asia/Muscat","<+04>-4" 262 | "Asia/Nicosia","EET-2EEST,M3.5.0/3,M10.5.0/4" 263 | "Asia/Novokuznetsk","<+07>-7" 264 | "Asia/Novosibirsk","<+07>-7" 265 | "Asia/Omsk","<+06>-6" 266 | "Asia/Oral","<+05>-5" 267 | "Asia/Phnom_Penh","<+07>-7" 268 | "Asia/Pontianak","WIB-7" 269 | "Asia/Pyongyang","KST-9" 270 | "Asia/Qatar","<+03>-3" 271 | "Asia/Qyzylorda","<+05>-5" 272 | "Asia/Riyadh","<+03>-3" 273 | "Asia/Sakhalin","<+11>-11" 274 | "Asia/Samarkand","<+05>-5" 275 | "Asia/Seoul","KST-9" 276 | "Asia/Shanghai","CST-8" 277 | "Asia/Singapore","<+08>-8" 278 | "Asia/Srednekolymsk","<+11>-11" 279 | "Asia/Taipei","CST-8" 280 | "Asia/Tashkent","<+05>-5" 281 | "Asia/Tbilisi","<+04>-4" 282 | "Asia/Tehran","<+0330>-3:30" 283 | "Asia/Thimphu","<+06>-6" 284 | "Asia/Tokyo","JST-9" 285 | "Asia/Tomsk","<+07>-7" 286 | "Asia/Ulaanbaatar","<+08>-8" 287 | "Asia/Urumqi","<+06>-6" 288 | "Asia/Ust-Nera","<+10>-10" 289 | "Asia/Vientiane","<+07>-7" 290 | "Asia/Vladivostok","<+10>-10" 291 | "Asia/Yakutsk","<+09>-9" 292 | "Asia/Yangon","<+0630>-6:30" 293 | "Asia/Yekaterinburg","<+05>-5" 294 | "Asia/Yerevan","<+04>-4" 295 | "Atlantic/Azores","<-01>1<+00>,M3.5.0/0,M10.5.0/1" 296 | "Atlantic/Bermuda","AST4ADT,M3.2.0,M11.1.0" 297 | "Atlantic/Canary","WET0WEST,M3.5.0/1,M10.5.0" 298 | "Atlantic/Cape_Verde","<-01>1" 299 | "Atlantic/Faroe","WET0WEST,M3.5.0/1,M10.5.0" 300 | "Atlantic/Madeira","WET0WEST,M3.5.0/1,M10.5.0" 301 | "Atlantic/Reykjavik","GMT0" 302 | "Atlantic/South_Georgia","<-02>2" 303 | "Atlantic/Stanley","<-03>3" 304 | "Atlantic/St_Helena","GMT0" 305 | "Australia/Adelaide","ACST-9:30ACDT,M10.1.0,M4.1.0/3" 306 | "Australia/Brisbane","AEST-10" 307 | "Australia/Broken_Hill","ACST-9:30ACDT,M10.1.0,M4.1.0/3" 308 | "Australia/Currie","AEST-10AEDT,M10.1.0,M4.1.0/3" 309 | "Australia/Darwin","ACST-9:30" 310 | "Australia/Eucla","<+0845>-8:45" 311 | "Australia/Hobart","AEST-10AEDT,M10.1.0,M4.1.0/3" 312 | "Australia/Lindeman","AEST-10" 313 | "Australia/Lord_Howe","<+1030>-10:30<+11>-11,M10.1.0,M4.1.0" 314 | "Australia/Melbourne","AEST-10AEDT,M10.1.0,M4.1.0/3" 315 | "Australia/Perth","AWST-8" 316 | "Australia/Sydney","AEST-10AEDT,M10.1.0,M4.1.0/3" 317 | "Europe/Amsterdam","CET-1CEST,M3.5.0,M10.5.0/3" 318 | "Europe/Andorra","CET-1CEST,M3.5.0,M10.5.0/3" 319 | "Europe/Astrakhan","<+04>-4" 320 | "Europe/Athens","EET-2EEST,M3.5.0/3,M10.5.0/4" 321 | "Europe/Belgrade","CET-1CEST,M3.5.0,M10.5.0/3" 322 | "Europe/Berlin","CET-1CEST,M3.5.0,M10.5.0/3" 323 | "Europe/Bratislava","CET-1CEST,M3.5.0,M10.5.0/3" 324 | "Europe/Brussels","CET-1CEST,M3.5.0,M10.5.0/3" 325 | "Europe/Bucharest","EET-2EEST,M3.5.0/3,M10.5.0/4" 326 | "Europe/Budapest","CET-1CEST,M3.5.0,M10.5.0/3" 327 | "Europe/Busingen","CET-1CEST,M3.5.0,M10.5.0/3" 328 | "Europe/Chisinau","EET-2EEST,M3.5.0,M10.5.0/3" 329 | "Europe/Copenhagen","CET-1CEST,M3.5.0,M10.5.0/3" 330 | "Europe/Dublin","IST-1GMT0,M10.5.0,M3.5.0/1" 331 | "Europe/Gibraltar","CET-1CEST,M3.5.0,M10.5.0/3" 332 | "Europe/Guernsey","GMT0BST,M3.5.0/1,M10.5.0" 333 | "Europe/Helsinki","EET-2EEST,M3.5.0/3,M10.5.0/4" 334 | "Europe/Isle_of_Man","GMT0BST,M3.5.0/1,M10.5.0" 335 | "Europe/Istanbul","<+03>-3" 336 | "Europe/Jersey","GMT0BST,M3.5.0/1,M10.5.0" 337 | "Europe/Kaliningrad","EET-2" 338 | "Europe/Kiev","EET-2EEST,M3.5.0/3,M10.5.0/4" 339 | "Europe/Kirov","MSK-3" 340 | "Europe/Lisbon","WET0WEST,M3.5.0/1,M10.5.0" 341 | "Europe/Ljubljana","CET-1CEST,M3.5.0,M10.5.0/3" 342 | "Europe/London","GMT0BST,M3.5.0/1,M10.5.0" 343 | "Europe/Luxembourg","CET-1CEST,M3.5.0,M10.5.0/3" 344 | "Europe/Madrid","CET-1CEST,M3.5.0,M10.5.0/3" 345 | "Europe/Malta","CET-1CEST,M3.5.0,M10.5.0/3" 346 | "Europe/Mariehamn","EET-2EEST,M3.5.0/3,M10.5.0/4" 347 | "Europe/Minsk","<+03>-3" 348 | "Europe/Monaco","CET-1CEST,M3.5.0,M10.5.0/3" 349 | "Europe/Moscow","MSK-3" 350 | "Europe/Oslo","CET-1CEST,M3.5.0,M10.5.0/3" 351 | "Europe/Paris","CET-1CEST,M3.5.0,M10.5.0/3" 352 | "Europe/Podgorica","CET-1CEST,M3.5.0,M10.5.0/3" 353 | "Europe/Prague","CET-1CEST,M3.5.0,M10.5.0/3" 354 | "Europe/Riga","EET-2EEST,M3.5.0/3,M10.5.0/4" 355 | "Europe/Rome","CET-1CEST,M3.5.0,M10.5.0/3" 356 | "Europe/Samara","<+04>-4" 357 | "Europe/San_Marino","CET-1CEST,M3.5.0,M10.5.0/3" 358 | "Europe/Sarajevo","CET-1CEST,M3.5.0,M10.5.0/3" 359 | "Europe/Saratov","<+04>-4" 360 | "Europe/Simferopol","MSK-3" 361 | "Europe/Skopje","CET-1CEST,M3.5.0,M10.5.0/3" 362 | "Europe/Sofia","EET-2EEST,M3.5.0/3,M10.5.0/4" 363 | "Europe/Stockholm","CET-1CEST,M3.5.0,M10.5.0/3" 364 | "Europe/Tallinn","EET-2EEST,M3.5.0/3,M10.5.0/4" 365 | "Europe/Tirane","CET-1CEST,M3.5.0,M10.5.0/3" 366 | "Europe/Ulyanovsk","<+04>-4" 367 | "Europe/Uzhgorod","EET-2EEST,M3.5.0/3,M10.5.0/4" 368 | "Europe/Vaduz","CET-1CEST,M3.5.0,M10.5.0/3" 369 | "Europe/Vatican","CET-1CEST,M3.5.0,M10.5.0/3" 370 | "Europe/Vienna","CET-1CEST,M3.5.0,M10.5.0/3" 371 | "Europe/Vilnius","EET-2EEST,M3.5.0/3,M10.5.0/4" 372 | "Europe/Volgograd","MSK-3" 373 | "Europe/Warsaw","CET-1CEST,M3.5.0,M10.5.0/3" 374 | "Europe/Zagreb","CET-1CEST,M3.5.0,M10.5.0/3" 375 | "Europe/Zaporozhye","EET-2EEST,M3.5.0/3,M10.5.0/4" 376 | "Europe/Zurich","CET-1CEST,M3.5.0,M10.5.0/3" 377 | "Indian/Antananarivo","EAT-3" 378 | "Indian/Chagos","<+06>-6" 379 | "Indian/Christmas","<+07>-7" 380 | "Indian/Cocos","<+0630>-6:30" 381 | "Indian/Comoro","EAT-3" 382 | "Indian/Kerguelen","<+05>-5" 383 | "Indian/Mahe","<+04>-4" 384 | "Indian/Maldives","<+05>-5" 385 | "Indian/Mauritius","<+04>-4" 386 | "Indian/Mayotte","EAT-3" 387 | "Indian/Reunion","<+04>-4" 388 | "Pacific/Apia","<+13>-13" 389 | "Pacific/Auckland","NZST-12NZDT,M9.5.0,M4.1.0/3" 390 | "Pacific/Bougainville","<+11>-11" 391 | "Pacific/Chatham","<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45" 392 | "Pacific/Chuuk","<+10>-10" 393 | "Pacific/Easter","<-06>6<-05>,M9.1.6/22,M4.1.6/22" 394 | "Pacific/Efate","<+11>-11" 395 | "Pacific/Enderbury","<+13>-13" 396 | "Pacific/Fakaofo","<+13>-13" 397 | "Pacific/Fiji","<+12>-12" 398 | "Pacific/Funafuti","<+12>-12" 399 | "Pacific/Galapagos","<-06>6" 400 | "Pacific/Gambier","<-09>9" 401 | "Pacific/Guadalcanal","<+11>-11" 402 | "Pacific/Guam","ChST-10" 403 | "Pacific/Honolulu","HST10" 404 | "Pacific/Kiritimati","<+14>-14" 405 | "Pacific/Kosrae","<+11>-11" 406 | "Pacific/Kwajalein","<+12>-12" 407 | "Pacific/Majuro","<+12>-12" 408 | "Pacific/Marquesas","<-0930>9:30" 409 | "Pacific/Midway","SST11" 410 | "Pacific/Nauru","<+12>-12" 411 | "Pacific/Niue","<-11>11" 412 | "Pacific/Norfolk","<+11>-11<+12>,M10.1.0,M4.1.0/3" 413 | "Pacific/Noumea","<+11>-11" 414 | "Pacific/Pago_Pago","SST11" 415 | "Pacific/Palau","<+09>-9" 416 | "Pacific/Pitcairn","<-08>8" 417 | "Pacific/Pohnpei","<+11>-11" 418 | "Pacific/Port_Moresby","<+10>-10" 419 | "Pacific/Rarotonga","<-10>10" 420 | "Pacific/Saipan","ChST-10" 421 | "Pacific/Tahiti","<-10>10" 422 | "Pacific/Tarawa","<+12>-12" 423 | "Pacific/Tongatapu","<+13>-13" 424 | "Pacific/Wake","<+12>-12" 425 | "Pacific/Wallis","<+12>-12" 426 | -------------------------------------------------------------------------------- /zones.json: -------------------------------------------------------------------------------- 1 | { 2 | "Africa/Abidjan":"GMT0", 3 | "Africa/Accra":"GMT0", 4 | "Africa/Addis_Ababa":"EAT-3", 5 | "Africa/Algiers":"CET-1", 6 | "Africa/Asmara":"EAT-3", 7 | "Africa/Bamako":"GMT0", 8 | "Africa/Bangui":"WAT-1", 9 | "Africa/Banjul":"GMT0", 10 | "Africa/Bissau":"GMT0", 11 | "Africa/Blantyre":"CAT-2", 12 | "Africa/Brazzaville":"WAT-1", 13 | "Africa/Bujumbura":"CAT-2", 14 | "Africa/Cairo":"EET-2EEST,M4.5.5/0,M10.5.4/24", 15 | "Africa/Casablanca":"<+01>-1", 16 | "Africa/Ceuta":"CET-1CEST,M3.5.0,M10.5.0/3", 17 | "Africa/Conakry":"GMT0", 18 | "Africa/Dakar":"GMT0", 19 | "Africa/Dar_es_Salaam":"EAT-3", 20 | "Africa/Djibouti":"EAT-3", 21 | "Africa/Douala":"WAT-1", 22 | "Africa/El_Aaiun":"<+01>-1", 23 | "Africa/Freetown":"GMT0", 24 | "Africa/Gaborone":"CAT-2", 25 | "Africa/Harare":"CAT-2", 26 | "Africa/Johannesburg":"SAST-2", 27 | "Africa/Juba":"CAT-2", 28 | "Africa/Kampala":"EAT-3", 29 | "Africa/Khartoum":"CAT-2", 30 | "Africa/Kigali":"CAT-2", 31 | "Africa/Kinshasa":"WAT-1", 32 | "Africa/Lagos":"WAT-1", 33 | "Africa/Libreville":"WAT-1", 34 | "Africa/Lome":"GMT0", 35 | "Africa/Luanda":"WAT-1", 36 | "Africa/Lubumbashi":"CAT-2", 37 | "Africa/Lusaka":"CAT-2", 38 | "Africa/Malabo":"WAT-1", 39 | "Africa/Maputo":"CAT-2", 40 | "Africa/Maseru":"SAST-2", 41 | "Africa/Mbabane":"SAST-2", 42 | "Africa/Mogadishu":"EAT-3", 43 | "Africa/Monrovia":"GMT0", 44 | "Africa/Nairobi":"EAT-3", 45 | "Africa/Ndjamena":"WAT-1", 46 | "Africa/Niamey":"WAT-1", 47 | "Africa/Nouakchott":"GMT0", 48 | "Africa/Ouagadougou":"GMT0", 49 | "Africa/Porto-Novo":"WAT-1", 50 | "Africa/Sao_Tome":"GMT0", 51 | "Africa/Tripoli":"EET-2", 52 | "Africa/Tunis":"CET-1", 53 | "Africa/Windhoek":"CAT-2", 54 | "America/Adak":"HST10HDT,M3.2.0,M11.1.0", 55 | "America/Anchorage":"AKST9AKDT,M3.2.0,M11.1.0", 56 | "America/Anguilla":"AST4", 57 | "America/Antigua":"AST4", 58 | "America/Araguaina":"<-03>3", 59 | "America/Argentina/Buenos_Aires":"<-03>3", 60 | "America/Argentina/Catamarca":"<-03>3", 61 | "America/Argentina/Cordoba":"<-03>3", 62 | "America/Argentina/Jujuy":"<-03>3", 63 | "America/Argentina/La_Rioja":"<-03>3", 64 | "America/Argentina/Mendoza":"<-03>3", 65 | "America/Argentina/Rio_Gallegos":"<-03>3", 66 | "America/Argentina/Salta":"<-03>3", 67 | "America/Argentina/San_Juan":"<-03>3", 68 | "America/Argentina/San_Luis":"<-03>3", 69 | "America/Argentina/Tucuman":"<-03>3", 70 | "America/Argentina/Ushuaia":"<-03>3", 71 | "America/Aruba":"AST4", 72 | "America/Asuncion":"<-04>4<-03>,M10.1.0/0,M3.4.0/0", 73 | "America/Atikokan":"EST5", 74 | "America/Bahia":"<-03>3", 75 | "America/Bahia_Banderas":"CST6", 76 | "America/Barbados":"AST4", 77 | "America/Belem":"<-03>3", 78 | "America/Belize":"CST6", 79 | "America/Blanc-Sablon":"AST4", 80 | "America/Boa_Vista":"<-04>4", 81 | "America/Bogota":"<-05>5", 82 | "America/Boise":"MST7MDT,M3.2.0,M11.1.0", 83 | "America/Cambridge_Bay":"MST7MDT,M3.2.0,M11.1.0", 84 | "America/Campo_Grande":"<-04>4", 85 | "America/Cancun":"EST5", 86 | "America/Caracas":"<-04>4", 87 | "America/Cayenne":"<-03>3", 88 | "America/Cayman":"EST5", 89 | "America/Chicago":"CST6CDT,M3.2.0,M11.1.0", 90 | "America/Chihuahua":"CST6", 91 | "America/Costa_Rica":"CST6", 92 | "America/Creston":"MST7", 93 | "America/Cuiaba":"<-04>4", 94 | "America/Curacao":"AST4", 95 | "America/Danmarkshavn":"GMT0", 96 | "America/Dawson":"MST7", 97 | "America/Dawson_Creek":"MST7", 98 | "America/Denver":"MST7MDT,M3.2.0,M11.1.0", 99 | "America/Detroit":"EST5EDT,M3.2.0,M11.1.0", 100 | "America/Dominica":"AST4", 101 | "America/Edmonton":"MST7MDT,M3.2.0,M11.1.0", 102 | "America/Eirunepe":"<-05>5", 103 | "America/El_Salvador":"CST6", 104 | "America/Fort_Nelson":"MST7", 105 | "America/Fortaleza":"<-03>3", 106 | "America/Glace_Bay":"AST4ADT,M3.2.0,M11.1.0", 107 | "America/Godthab":"<-02>2<-01>,M3.5.0/-1,M10.5.0/0", 108 | "America/Goose_Bay":"AST4ADT,M3.2.0,M11.1.0", 109 | "America/Grand_Turk":"EST5EDT,M3.2.0,M11.1.0", 110 | "America/Grenada":"AST4", 111 | "America/Guadeloupe":"AST4", 112 | "America/Guatemala":"CST6", 113 | "America/Guayaquil":"<-05>5", 114 | "America/Guyana":"<-04>4", 115 | "America/Halifax":"AST4ADT,M3.2.0,M11.1.0", 116 | "America/Havana":"CST5CDT,M3.2.0/0,M11.1.0/1", 117 | "America/Hermosillo":"MST7", 118 | "America/Indiana/Indianapolis":"EST5EDT,M3.2.0,M11.1.0", 119 | "America/Indiana/Knox":"CST6CDT,M3.2.0,M11.1.0", 120 | "America/Indiana/Marengo":"EST5EDT,M3.2.0,M11.1.0", 121 | "America/Indiana/Petersburg":"EST5EDT,M3.2.0,M11.1.0", 122 | "America/Indiana/Tell_City":"CST6CDT,M3.2.0,M11.1.0", 123 | "America/Indiana/Vevay":"EST5EDT,M3.2.0,M11.1.0", 124 | "America/Indiana/Vincennes":"EST5EDT,M3.2.0,M11.1.0", 125 | "America/Indiana/Winamac":"EST5EDT,M3.2.0,M11.1.0", 126 | "America/Inuvik":"MST7MDT,M3.2.0,M11.1.0", 127 | "America/Iqaluit":"EST5EDT,M3.2.0,M11.1.0", 128 | "America/Jamaica":"EST5", 129 | "America/Juneau":"AKST9AKDT,M3.2.0,M11.1.0", 130 | "America/Kentucky/Louisville":"EST5EDT,M3.2.0,M11.1.0", 131 | "America/Kentucky/Monticello":"EST5EDT,M3.2.0,M11.1.0", 132 | "America/Kralendijk":"AST4", 133 | "America/La_Paz":"<-04>4", 134 | "America/Lima":"<-05>5", 135 | "America/Los_Angeles":"PST8PDT,M3.2.0,M11.1.0", 136 | "America/Lower_Princes":"AST4", 137 | "America/Maceio":"<-03>3", 138 | "America/Managua":"CST6", 139 | "America/Manaus":"<-04>4", 140 | "America/Marigot":"AST4", 141 | "America/Martinique":"AST4", 142 | "America/Matamoros":"CST6CDT,M3.2.0,M11.1.0", 143 | "America/Mazatlan":"MST7", 144 | "America/Menominee":"CST6CDT,M3.2.0,M11.1.0", 145 | "America/Merida":"CST6", 146 | "America/Metlakatla":"AKST9AKDT,M3.2.0,M11.1.0", 147 | "America/Mexico_City":"CST6", 148 | "America/Miquelon":"<-03>3<-02>,M3.2.0,M11.1.0", 149 | "America/Moncton":"AST4ADT,M3.2.0,M11.1.0", 150 | "America/Monterrey":"CST6", 151 | "America/Montevideo":"<-03>3", 152 | "America/Montreal":"EST5EDT,M3.2.0,M11.1.0", 153 | "America/Montserrat":"AST4", 154 | "America/Nassau":"EST5EDT,M3.2.0,M11.1.0", 155 | "America/New_York":"EST5EDT,M3.2.0,M11.1.0", 156 | "America/Nipigon":"EST5EDT,M3.2.0,M11.1.0", 157 | "America/Nome":"AKST9AKDT,M3.2.0,M11.1.0", 158 | "America/Noronha":"<-02>2", 159 | "America/North_Dakota/Beulah":"CST6CDT,M3.2.0,M11.1.0", 160 | "America/North_Dakota/Center":"CST6CDT,M3.2.0,M11.1.0", 161 | "America/North_Dakota/New_Salem":"CST6CDT,M3.2.0,M11.1.0", 162 | "America/Ojinaga":"CST6CDT,M3.2.0,M11.1.0", 163 | "America/Panama":"EST5", 164 | "America/Pangnirtung":"EST5EDT,M3.2.0,M11.1.0", 165 | "America/Paramaribo":"<-03>3", 166 | "America/Phoenix":"MST7", 167 | "America/Port-au-Prince":"EST5EDT,M3.2.0,M11.1.0", 168 | "America/Port_of_Spain":"AST4", 169 | "America/Porto_Velho":"<-04>4", 170 | "America/Puerto_Rico":"AST4", 171 | "America/Punta_Arenas":"<-03>3", 172 | "America/Rainy_River":"CST6CDT,M3.2.0,M11.1.0", 173 | "America/Rankin_Inlet":"CST6CDT,M3.2.0,M11.1.0", 174 | "America/Recife":"<-03>3", 175 | "America/Regina":"CST6", 176 | "America/Resolute":"CST6CDT,M3.2.0,M11.1.0", 177 | "America/Rio_Branco":"<-05>5", 178 | "America/Santarem":"<-03>3", 179 | "America/Santiago":"<-04>4<-03>,M9.1.6/24,M4.1.6/24", 180 | "America/Santo_Domingo":"AST4", 181 | "America/Sao_Paulo":"<-03>3", 182 | "America/Scoresbysund":"<-01>1<+00>,M3.5.0/0,M10.5.0/1", 183 | "America/Sitka":"AKST9AKDT,M3.2.0,M11.1.0", 184 | "America/St_Barthelemy":"AST4", 185 | "America/St_Johns":"NST3:30NDT,M3.2.0,M11.1.0", 186 | "America/St_Kitts":"AST4", 187 | "America/St_Lucia":"AST4", 188 | "America/St_Thomas":"AST4", 189 | "America/St_Vincent":"AST4", 190 | "America/Swift_Current":"CST6", 191 | "America/Tegucigalpa":"CST6", 192 | "America/Thule":"AST4ADT,M3.2.0,M11.1.0", 193 | "America/Thunder_Bay":"EST5EDT,M3.2.0,M11.1.0", 194 | "America/Tijuana":"PST8PDT,M3.2.0,M11.1.0", 195 | "America/Toronto":"EST5EDT,M3.2.0,M11.1.0", 196 | "America/Tortola":"AST4", 197 | "America/Vancouver":"PST8PDT,M3.2.0,M11.1.0", 198 | "America/Whitehorse":"MST7", 199 | "America/Winnipeg":"CST6CDT,M3.2.0,M11.1.0", 200 | "America/Yakutat":"AKST9AKDT,M3.2.0,M11.1.0", 201 | "America/Yellowknife":"MST7MDT,M3.2.0,M11.1.0", 202 | "Antarctica/Casey":"<+11>-11", 203 | "Antarctica/Davis":"<+07>-7", 204 | "Antarctica/DumontDUrville":"<+10>-10", 205 | "Antarctica/Macquarie":"AEST-10AEDT,M10.1.0,M4.1.0/3", 206 | "Antarctica/Mawson":"<+05>-5", 207 | "Antarctica/McMurdo":"NZST-12NZDT,M9.5.0,M4.1.0/3", 208 | "Antarctica/Palmer":"<-03>3", 209 | "Antarctica/Rothera":"<-03>3", 210 | "Antarctica/Syowa":"<+03>-3", 211 | "Antarctica/Troll":"<+00>0<+02>-2,M3.5.0/1,M10.5.0/3", 212 | "Antarctica/Vostok":"<+06>-6", 213 | "Arctic/Longyearbyen":"CET-1CEST,M3.5.0,M10.5.0/3", 214 | "Asia/Aden":"<+03>-3", 215 | "Asia/Almaty":"<+06>-6", 216 | "Asia/Amman":"<+03>-3", 217 | "Asia/Anadyr":"<+12>-12", 218 | "Asia/Aqtau":"<+05>-5", 219 | "Asia/Aqtobe":"<+05>-5", 220 | "Asia/Ashgabat":"<+05>-5", 221 | "Asia/Atyrau":"<+05>-5", 222 | "Asia/Baghdad":"<+03>-3", 223 | "Asia/Bahrain":"<+03>-3", 224 | "Asia/Baku":"<+04>-4", 225 | "Asia/Bangkok":"<+07>-7", 226 | "Asia/Barnaul":"<+07>-7", 227 | "Asia/Beirut":"EET-2EEST,M3.5.0/0,M10.5.0/0", 228 | "Asia/Bishkek":"<+06>-6", 229 | "Asia/Brunei":"<+08>-8", 230 | "Asia/Chita":"<+09>-9", 231 | "Asia/Choibalsan":"<+08>-8", 232 | "Asia/Colombo":"<+0530>-5:30", 233 | "Asia/Damascus":"<+03>-3", 234 | "Asia/Dhaka":"<+06>-6", 235 | "Asia/Dili":"<+09>-9", 236 | "Asia/Dubai":"<+04>-4", 237 | "Asia/Dushanbe":"<+05>-5", 238 | "Asia/Famagusta":"EET-2EEST,M3.5.0/3,M10.5.0/4", 239 | "Asia/Gaza":"EET-2EEST,M3.4.4/50,M10.4.4/50", 240 | "Asia/Hebron":"EET-2EEST,M3.4.4/50,M10.4.4/50", 241 | "Asia/Ho_Chi_Minh":"<+07>-7", 242 | "Asia/Hong_Kong":"HKT-8", 243 | "Asia/Hovd":"<+07>-7", 244 | "Asia/Irkutsk":"<+08>-8", 245 | "Asia/Jakarta":"WIB-7", 246 | "Asia/Jayapura":"WIT-9", 247 | "Asia/Jerusalem":"IST-2IDT,M3.4.4/26,M10.5.0", 248 | "Asia/Kabul":"<+0430>-4:30", 249 | "Asia/Kamchatka":"<+12>-12", 250 | "Asia/Karachi":"PKT-5", 251 | "Asia/Kathmandu":"<+0545>-5:45", 252 | "Asia/Khandyga":"<+09>-9", 253 | "Asia/Kolkata":"IST-5:30", 254 | "Asia/Krasnoyarsk":"<+07>-7", 255 | "Asia/Kuala_Lumpur":"<+08>-8", 256 | "Asia/Kuching":"<+08>-8", 257 | "Asia/Kuwait":"<+03>-3", 258 | "Asia/Macau":"CST-8", 259 | "Asia/Magadan":"<+11>-11", 260 | "Asia/Makassar":"WITA-8", 261 | "Asia/Manila":"PST-8", 262 | "Asia/Muscat":"<+04>-4", 263 | "Asia/Nicosia":"EET-2EEST,M3.5.0/3,M10.5.0/4", 264 | "Asia/Novokuznetsk":"<+07>-7", 265 | "Asia/Novosibirsk":"<+07>-7", 266 | "Asia/Omsk":"<+06>-6", 267 | "Asia/Oral":"<+05>-5", 268 | "Asia/Phnom_Penh":"<+07>-7", 269 | "Asia/Pontianak":"WIB-7", 270 | "Asia/Pyongyang":"KST-9", 271 | "Asia/Qatar":"<+03>-3", 272 | "Asia/Qyzylorda":"<+05>-5", 273 | "Asia/Riyadh":"<+03>-3", 274 | "Asia/Sakhalin":"<+11>-11", 275 | "Asia/Samarkand":"<+05>-5", 276 | "Asia/Seoul":"KST-9", 277 | "Asia/Shanghai":"CST-8", 278 | "Asia/Singapore":"<+08>-8", 279 | "Asia/Srednekolymsk":"<+11>-11", 280 | "Asia/Taipei":"CST-8", 281 | "Asia/Tashkent":"<+05>-5", 282 | "Asia/Tbilisi":"<+04>-4", 283 | "Asia/Tehran":"<+0330>-3:30", 284 | "Asia/Thimphu":"<+06>-6", 285 | "Asia/Tokyo":"JST-9", 286 | "Asia/Tomsk":"<+07>-7", 287 | "Asia/Ulaanbaatar":"<+08>-8", 288 | "Asia/Urumqi":"<+06>-6", 289 | "Asia/Ust-Nera":"<+10>-10", 290 | "Asia/Vientiane":"<+07>-7", 291 | "Asia/Vladivostok":"<+10>-10", 292 | "Asia/Yakutsk":"<+09>-9", 293 | "Asia/Yangon":"<+0630>-6:30", 294 | "Asia/Yekaterinburg":"<+05>-5", 295 | "Asia/Yerevan":"<+04>-4", 296 | "Atlantic/Azores":"<-01>1<+00>,M3.5.0/0,M10.5.0/1", 297 | "Atlantic/Bermuda":"AST4ADT,M3.2.0,M11.1.0", 298 | "Atlantic/Canary":"WET0WEST,M3.5.0/1,M10.5.0", 299 | "Atlantic/Cape_Verde":"<-01>1", 300 | "Atlantic/Faroe":"WET0WEST,M3.5.0/1,M10.5.0", 301 | "Atlantic/Madeira":"WET0WEST,M3.5.0/1,M10.5.0", 302 | "Atlantic/Reykjavik":"GMT0", 303 | "Atlantic/South_Georgia":"<-02>2", 304 | "Atlantic/St_Helena":"GMT0", 305 | "Atlantic/Stanley":"<-03>3", 306 | "Australia/Adelaide":"ACST-9:30ACDT,M10.1.0,M4.1.0/3", 307 | "Australia/Brisbane":"AEST-10", 308 | "Australia/Broken_Hill":"ACST-9:30ACDT,M10.1.0,M4.1.0/3", 309 | "Australia/Currie":"AEST-10AEDT,M10.1.0,M4.1.0/3", 310 | "Australia/Darwin":"ACST-9:30", 311 | "Australia/Eucla":"<+0845>-8:45", 312 | "Australia/Hobart":"AEST-10AEDT,M10.1.0,M4.1.0/3", 313 | "Australia/Lindeman":"AEST-10", 314 | "Australia/Lord_Howe":"<+1030>-10:30<+11>-11,M10.1.0,M4.1.0", 315 | "Australia/Melbourne":"AEST-10AEDT,M10.1.0,M4.1.0/3", 316 | "Australia/Perth":"AWST-8", 317 | "Australia/Sydney":"AEST-10AEDT,M10.1.0,M4.1.0/3", 318 | "Europe/Amsterdam":"CET-1CEST,M3.5.0,M10.5.0/3", 319 | "Europe/Andorra":"CET-1CEST,M3.5.0,M10.5.0/3", 320 | "Europe/Astrakhan":"<+04>-4", 321 | "Europe/Athens":"EET-2EEST,M3.5.0/3,M10.5.0/4", 322 | "Europe/Belgrade":"CET-1CEST,M3.5.0,M10.5.0/3", 323 | "Europe/Berlin":"CET-1CEST,M3.5.0,M10.5.0/3", 324 | "Europe/Bratislava":"CET-1CEST,M3.5.0,M10.5.0/3", 325 | "Europe/Brussels":"CET-1CEST,M3.5.0,M10.5.0/3", 326 | "Europe/Bucharest":"EET-2EEST,M3.5.0/3,M10.5.0/4", 327 | "Europe/Budapest":"CET-1CEST,M3.5.0,M10.5.0/3", 328 | "Europe/Busingen":"CET-1CEST,M3.5.0,M10.5.0/3", 329 | "Europe/Chisinau":"EET-2EEST,M3.5.0,M10.5.0/3", 330 | "Europe/Copenhagen":"CET-1CEST,M3.5.0,M10.5.0/3", 331 | "Europe/Dublin":"IST-1GMT0,M10.5.0,M3.5.0/1", 332 | "Europe/Gibraltar":"CET-1CEST,M3.5.0,M10.5.0/3", 333 | "Europe/Guernsey":"GMT0BST,M3.5.0/1,M10.5.0", 334 | "Europe/Helsinki":"EET-2EEST,M3.5.0/3,M10.5.0/4", 335 | "Europe/Isle_of_Man":"GMT0BST,M3.5.0/1,M10.5.0", 336 | "Europe/Istanbul":"<+03>-3", 337 | "Europe/Jersey":"GMT0BST,M3.5.0/1,M10.5.0", 338 | "Europe/Kaliningrad":"EET-2", 339 | "Europe/Kiev":"EET-2EEST,M3.5.0/3,M10.5.0/4", 340 | "Europe/Kirov":"MSK-3", 341 | "Europe/Lisbon":"WET0WEST,M3.5.0/1,M10.5.0", 342 | "Europe/Ljubljana":"CET-1CEST,M3.5.0,M10.5.0/3", 343 | "Europe/London":"GMT0BST,M3.5.0/1,M10.5.0", 344 | "Europe/Luxembourg":"CET-1CEST,M3.5.0,M10.5.0/3", 345 | "Europe/Madrid":"CET-1CEST,M3.5.0,M10.5.0/3", 346 | "Europe/Malta":"CET-1CEST,M3.5.0,M10.5.0/3", 347 | "Europe/Mariehamn":"EET-2EEST,M3.5.0/3,M10.5.0/4", 348 | "Europe/Minsk":"<+03>-3", 349 | "Europe/Monaco":"CET-1CEST,M3.5.0,M10.5.0/3", 350 | "Europe/Moscow":"MSK-3", 351 | "Europe/Oslo":"CET-1CEST,M3.5.0,M10.5.0/3", 352 | "Europe/Paris":"CET-1CEST,M3.5.0,M10.5.0/3", 353 | "Europe/Podgorica":"CET-1CEST,M3.5.0,M10.5.0/3", 354 | "Europe/Prague":"CET-1CEST,M3.5.0,M10.5.0/3", 355 | "Europe/Riga":"EET-2EEST,M3.5.0/3,M10.5.0/4", 356 | "Europe/Rome":"CET-1CEST,M3.5.0,M10.5.0/3", 357 | "Europe/Samara":"<+04>-4", 358 | "Europe/San_Marino":"CET-1CEST,M3.5.0,M10.5.0/3", 359 | "Europe/Sarajevo":"CET-1CEST,M3.5.0,M10.5.0/3", 360 | "Europe/Saratov":"<+04>-4", 361 | "Europe/Simferopol":"MSK-3", 362 | "Europe/Skopje":"CET-1CEST,M3.5.0,M10.5.0/3", 363 | "Europe/Sofia":"EET-2EEST,M3.5.0/3,M10.5.0/4", 364 | "Europe/Stockholm":"CET-1CEST,M3.5.0,M10.5.0/3", 365 | "Europe/Tallinn":"EET-2EEST,M3.5.0/3,M10.5.0/4", 366 | "Europe/Tirane":"CET-1CEST,M3.5.0,M10.5.0/3", 367 | "Europe/Ulyanovsk":"<+04>-4", 368 | "Europe/Uzhgorod":"EET-2EEST,M3.5.0/3,M10.5.0/4", 369 | "Europe/Vaduz":"CET-1CEST,M3.5.0,M10.5.0/3", 370 | "Europe/Vatican":"CET-1CEST,M3.5.0,M10.5.0/3", 371 | "Europe/Vienna":"CET-1CEST,M3.5.0,M10.5.0/3", 372 | "Europe/Vilnius":"EET-2EEST,M3.5.0/3,M10.5.0/4", 373 | "Europe/Volgograd":"MSK-3", 374 | "Europe/Warsaw":"CET-1CEST,M3.5.0,M10.5.0/3", 375 | "Europe/Zagreb":"CET-1CEST,M3.5.0,M10.5.0/3", 376 | "Europe/Zaporozhye":"EET-2EEST,M3.5.0/3,M10.5.0/4", 377 | "Europe/Zurich":"CET-1CEST,M3.5.0,M10.5.0/3", 378 | "Indian/Antananarivo":"EAT-3", 379 | "Indian/Chagos":"<+06>-6", 380 | "Indian/Christmas":"<+07>-7", 381 | "Indian/Cocos":"<+0630>-6:30", 382 | "Indian/Comoro":"EAT-3", 383 | "Indian/Kerguelen":"<+05>-5", 384 | "Indian/Mahe":"<+04>-4", 385 | "Indian/Maldives":"<+05>-5", 386 | "Indian/Mauritius":"<+04>-4", 387 | "Indian/Mayotte":"EAT-3", 388 | "Indian/Reunion":"<+04>-4", 389 | "Pacific/Apia":"<+13>-13", 390 | "Pacific/Auckland":"NZST-12NZDT,M9.5.0,M4.1.0/3", 391 | "Pacific/Bougainville":"<+11>-11", 392 | "Pacific/Chatham":"<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45", 393 | "Pacific/Chuuk":"<+10>-10", 394 | "Pacific/Easter":"<-06>6<-05>,M9.1.6/22,M4.1.6/22", 395 | "Pacific/Efate":"<+11>-11", 396 | "Pacific/Enderbury":"<+13>-13", 397 | "Pacific/Fakaofo":"<+13>-13", 398 | "Pacific/Fiji":"<+12>-12", 399 | "Pacific/Funafuti":"<+12>-12", 400 | "Pacific/Galapagos":"<-06>6", 401 | "Pacific/Gambier":"<-09>9", 402 | "Pacific/Guadalcanal":"<+11>-11", 403 | "Pacific/Guam":"ChST-10", 404 | "Pacific/Honolulu":"HST10", 405 | "Pacific/Kiritimati":"<+14>-14", 406 | "Pacific/Kosrae":"<+11>-11", 407 | "Pacific/Kwajalein":"<+12>-12", 408 | "Pacific/Majuro":"<+12>-12", 409 | "Pacific/Marquesas":"<-0930>9:30", 410 | "Pacific/Midway":"SST11", 411 | "Pacific/Nauru":"<+12>-12", 412 | "Pacific/Niue":"<-11>11", 413 | "Pacific/Norfolk":"<+11>-11<+12>,M10.1.0,M4.1.0/3", 414 | "Pacific/Noumea":"<+11>-11", 415 | "Pacific/Pago_Pago":"SST11", 416 | "Pacific/Palau":"<+09>-9", 417 | "Pacific/Pitcairn":"<-08>8", 418 | "Pacific/Pohnpei":"<+11>-11", 419 | "Pacific/Port_Moresby":"<+10>-10", 420 | "Pacific/Rarotonga":"<-10>10", 421 | "Pacific/Saipan":"ChST-10", 422 | "Pacific/Tahiti":"<-10>10", 423 | "Pacific/Tarawa":"<+12>-12", 424 | "Pacific/Tongatapu":"<+13>-13", 425 | "Pacific/Wake":"<+12>-12", 426 | "Pacific/Wallis":"<+12>-12" 427 | } -------------------------------------------------------------------------------- /zones.c: -------------------------------------------------------------------------------- 1 | #include "zones.h" 2 | #include 3 | 4 | typedef struct { 5 | const char *name; 6 | const char *posix_str; 7 | } micro_tz_db_pair; 8 | 9 | static const micro_tz_db_pair micro_tz_db_tzs[425] = { 10 | {"Africa/Abidjan", "GMT0"}, 11 | {"Africa/Accra", "GMT0"}, 12 | {"Africa/Addis_Ababa", "EAT-3"}, 13 | {"Africa/Algiers", "CET-1"}, 14 | {"Africa/Asmara", "EAT-3"}, 15 | {"Africa/Bamako", "GMT0"}, 16 | {"Africa/Bangui", "WAT-1"}, 17 | {"Africa/Banjul", "GMT0"}, 18 | {"Africa/Bissau", "GMT0"}, 19 | {"Africa/Blantyre", "CAT-2"}, 20 | {"Africa/Brazzaville", "WAT-1"}, 21 | {"Africa/Bujumbura", "CAT-2"}, 22 | {"Africa/Cairo", "EET-2EEST,M4.5.5/0,M10.5.4/24"}, 23 | {"Africa/Casablanca", "<+01>-1"}, 24 | {"Africa/Ceuta", "CET-1CEST,M3.5.0,M10.5.0/3"}, 25 | {"Africa/Conakry", "GMT0"}, 26 | {"Africa/Dakar", "GMT0"}, 27 | {"Africa/Dar_es_Salaam", "EAT-3"}, 28 | {"Africa/Djibouti", "EAT-3"}, 29 | {"Africa/Douala", "WAT-1"}, 30 | {"Africa/El_Aaiun", "<+01>-1"}, 31 | {"Africa/Freetown", "GMT0"}, 32 | {"Africa/Gaborone", "CAT-2"}, 33 | {"Africa/Harare", "CAT-2"}, 34 | {"Africa/Johannesburg", "SAST-2"}, 35 | {"Africa/Juba", "CAT-2"}, 36 | {"Africa/Kampala", "EAT-3"}, 37 | {"Africa/Khartoum", "CAT-2"}, 38 | {"Africa/Kigali", "CAT-2"}, 39 | {"Africa/Kinshasa", "WAT-1"}, 40 | {"Africa/Lagos", "WAT-1"}, 41 | {"Africa/Libreville", "WAT-1"}, 42 | {"Africa/Lome", "GMT0"}, 43 | {"Africa/Luanda", "WAT-1"}, 44 | {"Africa/Lubumbashi", "CAT-2"}, 45 | {"Africa/Lusaka", "CAT-2"}, 46 | {"Africa/Malabo", "WAT-1"}, 47 | {"Africa/Maputo", "CAT-2"}, 48 | {"Africa/Maseru", "SAST-2"}, 49 | {"Africa/Mbabane", "SAST-2"}, 50 | {"Africa/Mogadishu", "EAT-3"}, 51 | {"Africa/Monrovia", "GMT0"}, 52 | {"Africa/Nairobi", "EAT-3"}, 53 | {"Africa/Ndjamena", "WAT-1"}, 54 | {"Africa/Niamey", "WAT-1"}, 55 | {"Africa/Nouakchott", "GMT0"}, 56 | {"Africa/Ouagadougou", "GMT0"}, 57 | {"Africa/Porto-Novo", "WAT-1"}, 58 | {"Africa/Sao_Tome", "GMT0"}, 59 | {"Africa/Tripoli", "EET-2"}, 60 | {"Africa/Tunis", "CET-1"}, 61 | {"Africa/Windhoek", "CAT-2"}, 62 | {"America/Adak", "HST10HDT,M3.2.0,M11.1.0"}, 63 | {"America/Anchorage", "AKST9AKDT,M3.2.0,M11.1.0"}, 64 | {"America/Anguilla", "AST4"}, 65 | {"America/Antigua", "AST4"}, 66 | {"America/Araguaina", "<-03>3"}, 67 | {"America/Argentina/Buenos_Aires", "<-03>3"}, 68 | {"America/Argentina/Catamarca", "<-03>3"}, 69 | {"America/Argentina/Cordoba", "<-03>3"}, 70 | {"America/Argentina/Jujuy", "<-03>3"}, 71 | {"America/Argentina/La_Rioja", "<-03>3"}, 72 | {"America/Argentina/Mendoza", "<-03>3"}, 73 | {"America/Argentina/Rio_Gallegos", "<-03>3"}, 74 | {"America/Argentina/Salta", "<-03>3"}, 75 | {"America/Argentina/San_Juan", "<-03>3"}, 76 | {"America/Argentina/San_Luis", "<-03>3"}, 77 | {"America/Argentina/Tucuman", "<-03>3"}, 78 | {"America/Argentina/Ushuaia", "<-03>3"}, 79 | {"America/Aruba", "AST4"}, 80 | {"America/Asuncion", "<-04>4<-03>,M10.1.0/0,M3.4.0/0"}, 81 | {"America/Atikokan", "EST5"}, 82 | {"America/Bahia", "<-03>3"}, 83 | {"America/Bahia_Banderas", "CST6"}, 84 | {"America/Barbados", "AST4"}, 85 | {"America/Belem", "<-03>3"}, 86 | {"America/Belize", "CST6"}, 87 | {"America/Blanc-Sablon", "AST4"}, 88 | {"America/Boa_Vista", "<-04>4"}, 89 | {"America/Bogota", "<-05>5"}, 90 | {"America/Boise", "MST7MDT,M3.2.0,M11.1.0"}, 91 | {"America/Cambridge_Bay", "MST7MDT,M3.2.0,M11.1.0"}, 92 | {"America/Campo_Grande", "<-04>4"}, 93 | {"America/Cancun", "EST5"}, 94 | {"America/Caracas", "<-04>4"}, 95 | {"America/Cayenne", "<-03>3"}, 96 | {"America/Cayman", "EST5"}, 97 | {"America/Chicago", "CST6CDT,M3.2.0,M11.1.0"}, 98 | {"America/Chihuahua", "CST6"}, 99 | {"America/Costa_Rica", "CST6"}, 100 | {"America/Creston", "MST7"}, 101 | {"America/Cuiaba", "<-04>4"}, 102 | {"America/Curacao", "AST4"}, 103 | {"America/Danmarkshavn", "GMT0"}, 104 | {"America/Dawson", "MST7"}, 105 | {"America/Dawson_Creek", "MST7"}, 106 | {"America/Denver", "MST7MDT,M3.2.0,M11.1.0"}, 107 | {"America/Detroit", "EST5EDT,M3.2.0,M11.1.0"}, 108 | {"America/Dominica", "AST4"}, 109 | {"America/Edmonton", "MST7MDT,M3.2.0,M11.1.0"}, 110 | {"America/Eirunepe", "<-05>5"}, 111 | {"America/El_Salvador", "CST6"}, 112 | {"America/Fortaleza", "<-03>3"}, 113 | {"America/Fort_Nelson", "MST7"}, 114 | {"America/Glace_Bay", "AST4ADT,M3.2.0,M11.1.0"}, 115 | {"America/Godthab", "<-02>2<-01>,M3.5.0/-1,M10.5.0/0"}, 116 | {"America/Goose_Bay", "AST4ADT,M3.2.0,M11.1.0"}, 117 | {"America/Grand_Turk", "EST5EDT,M3.2.0,M11.1.0"}, 118 | {"America/Grenada", "AST4"}, 119 | {"America/Guadeloupe", "AST4"}, 120 | {"America/Guatemala", "CST6"}, 121 | {"America/Guayaquil", "<-05>5"}, 122 | {"America/Guyana", "<-04>4"}, 123 | {"America/Halifax", "AST4ADT,M3.2.0,M11.1.0"}, 124 | {"America/Havana", "CST5CDT,M3.2.0/0,M11.1.0/1"}, 125 | {"America/Hermosillo", "MST7"}, 126 | {"America/Indiana/Indianapolis", "EST5EDT,M3.2.0,M11.1.0"}, 127 | {"America/Indiana/Knox", "CST6CDT,M3.2.0,M11.1.0"}, 128 | {"America/Indiana/Marengo", "EST5EDT,M3.2.0,M11.1.0"}, 129 | {"America/Indiana/Petersburg", "EST5EDT,M3.2.0,M11.1.0"}, 130 | {"America/Indiana/Tell_City", "CST6CDT,M3.2.0,M11.1.0"}, 131 | {"America/Indiana/Vevay", "EST5EDT,M3.2.0,M11.1.0"}, 132 | {"America/Indiana/Vincennes", "EST5EDT,M3.2.0,M11.1.0"}, 133 | {"America/Indiana/Winamac", "EST5EDT,M3.2.0,M11.1.0"}, 134 | {"America/Inuvik", "MST7MDT,M3.2.0,M11.1.0"}, 135 | {"America/Iqaluit", "EST5EDT,M3.2.0,M11.1.0"}, 136 | {"America/Jamaica", "EST5"}, 137 | {"America/Juneau", "AKST9AKDT,M3.2.0,M11.1.0"}, 138 | {"America/Kentucky/Louisville", "EST5EDT,M3.2.0,M11.1.0"}, 139 | {"America/Kentucky/Monticello", "EST5EDT,M3.2.0,M11.1.0"}, 140 | {"America/Kralendijk", "AST4"}, 141 | {"America/La_Paz", "<-04>4"}, 142 | {"America/Lima", "<-05>5"}, 143 | {"America/Los_Angeles", "PST8PDT,M3.2.0,M11.1.0"}, 144 | {"America/Lower_Princes", "AST4"}, 145 | {"America/Maceio", "<-03>3"}, 146 | {"America/Managua", "CST6"}, 147 | {"America/Manaus", "<-04>4"}, 148 | {"America/Marigot", "AST4"}, 149 | {"America/Martinique", "AST4"}, 150 | {"America/Matamoros", "CST6CDT,M3.2.0,M11.1.0"}, 151 | {"America/Mazatlan", "MST7"}, 152 | {"America/Menominee", "CST6CDT,M3.2.0,M11.1.0"}, 153 | {"America/Merida", "CST6"}, 154 | {"America/Metlakatla", "AKST9AKDT,M3.2.0,M11.1.0"}, 155 | {"America/Mexico_City", "CST6"}, 156 | {"America/Miquelon", "<-03>3<-02>,M3.2.0,M11.1.0"}, 157 | {"America/Moncton", "AST4ADT,M3.2.0,M11.1.0"}, 158 | {"America/Monterrey", "CST6"}, 159 | {"America/Montevideo", "<-03>3"}, 160 | {"America/Montreal", "EST5EDT,M3.2.0,M11.1.0"}, 161 | {"America/Montserrat", "AST4"}, 162 | {"America/Nassau", "EST5EDT,M3.2.0,M11.1.0"}, 163 | {"America/New_York", "EST5EDT,M3.2.0,M11.1.0"}, 164 | {"America/Nipigon", "EST5EDT,M3.2.0,M11.1.0"}, 165 | {"America/Nome", "AKST9AKDT,M3.2.0,M11.1.0"}, 166 | {"America/Noronha", "<-02>2"}, 167 | {"America/North_Dakota/Beulah", "CST6CDT,M3.2.0,M11.1.0"}, 168 | {"America/North_Dakota/Center", "CST6CDT,M3.2.0,M11.1.0"}, 169 | {"America/North_Dakota/New_Salem", "CST6CDT,M3.2.0,M11.1.0"}, 170 | {"America/Ojinaga", "CST6CDT,M3.2.0,M11.1.0"}, 171 | {"America/Panama", "EST5"}, 172 | {"America/Pangnirtung", "EST5EDT,M3.2.0,M11.1.0"}, 173 | {"America/Paramaribo", "<-03>3"}, 174 | {"America/Phoenix", "MST7"}, 175 | {"America/Port-au-Prince", "EST5EDT,M3.2.0,M11.1.0"}, 176 | {"America/Port_of_Spain", "AST4"}, 177 | {"America/Porto_Velho", "<-04>4"}, 178 | {"America/Puerto_Rico", "AST4"}, 179 | {"America/Punta_Arenas", "<-03>3"}, 180 | {"America/Rainy_River", "CST6CDT,M3.2.0,M11.1.0"}, 181 | {"America/Rankin_Inlet", "CST6CDT,M3.2.0,M11.1.0"}, 182 | {"America/Recife", "<-03>3"}, 183 | {"America/Regina", "CST6"}, 184 | {"America/Resolute", "CST6CDT,M3.2.0,M11.1.0"}, 185 | {"America/Rio_Branco", "<-05>5"}, 186 | {"America/Santarem", "<-03>3"}, 187 | {"America/Santiago", "<-04>4<-03>,M9.1.6/24,M4.1.6/24"}, 188 | {"America/Santo_Domingo", "AST4"}, 189 | {"America/Sao_Paulo", "<-03>3"}, 190 | {"America/Scoresbysund", "<-01>1<+00>,M3.5.0/0,M10.5.0/1"}, 191 | {"America/Sitka", "AKST9AKDT,M3.2.0,M11.1.0"}, 192 | {"America/St_Barthelemy", "AST4"}, 193 | {"America/St_Johns", "NST3:30NDT,M3.2.0,M11.1.0"}, 194 | {"America/St_Kitts", "AST4"}, 195 | {"America/St_Lucia", "AST4"}, 196 | {"America/St_Thomas", "AST4"}, 197 | {"America/St_Vincent", "AST4"}, 198 | {"America/Swift_Current", "CST6"}, 199 | {"America/Tegucigalpa", "CST6"}, 200 | {"America/Thule", "AST4ADT,M3.2.0,M11.1.0"}, 201 | {"America/Thunder_Bay", "EST5EDT,M3.2.0,M11.1.0"}, 202 | {"America/Tijuana", "PST8PDT,M3.2.0,M11.1.0"}, 203 | {"America/Toronto", "EST5EDT,M3.2.0,M11.1.0"}, 204 | {"America/Tortola", "AST4"}, 205 | {"America/Vancouver", "PST8PDT,M3.2.0,M11.1.0"}, 206 | {"America/Whitehorse", "MST7"}, 207 | {"America/Winnipeg", "CST6CDT,M3.2.0,M11.1.0"}, 208 | {"America/Yakutat", "AKST9AKDT,M3.2.0,M11.1.0"}, 209 | {"America/Yellowknife", "MST7MDT,M3.2.0,M11.1.0"}, 210 | {"Antarctica/Casey", "<+11>-11"}, 211 | {"Antarctica/Davis", "<+07>-7"}, 212 | {"Antarctica/DumontDUrville", "<+10>-10"}, 213 | {"Antarctica/Macquarie", "AEST-10AEDT,M10.1.0,M4.1.0/3"}, 214 | {"Antarctica/Mawson", "<+05>-5"}, 215 | {"Antarctica/McMurdo", "NZST-12NZDT,M9.5.0,M4.1.0/3"}, 216 | {"Antarctica/Palmer", "<-03>3"}, 217 | {"Antarctica/Rothera", "<-03>3"}, 218 | {"Antarctica/Syowa", "<+03>-3"}, 219 | {"Antarctica/Troll", "<+00>0<+02>-2,M3.5.0/1,M10.5.0/3"}, 220 | {"Antarctica/Vostok", "<+06>-6"}, 221 | {"Arctic/Longyearbyen", "CET-1CEST,M3.5.0,M10.5.0/3"}, 222 | {"Asia/Aden", "<+03>-3"}, 223 | {"Asia/Almaty", "<+06>-6"}, 224 | {"Asia/Amman", "<+03>-3"}, 225 | {"Asia/Anadyr", "<+12>-12"}, 226 | {"Asia/Aqtau", "<+05>-5"}, 227 | {"Asia/Aqtobe", "<+05>-5"}, 228 | {"Asia/Ashgabat", "<+05>-5"}, 229 | {"Asia/Atyrau", "<+05>-5"}, 230 | {"Asia/Baghdad", "<+03>-3"}, 231 | {"Asia/Bahrain", "<+03>-3"}, 232 | {"Asia/Baku", "<+04>-4"}, 233 | {"Asia/Bangkok", "<+07>-7"}, 234 | {"Asia/Barnaul", "<+07>-7"}, 235 | {"Asia/Beirut", "EET-2EEST,M3.5.0/0,M10.5.0/0"}, 236 | {"Asia/Bishkek", "<+06>-6"}, 237 | {"Asia/Brunei", "<+08>-8"}, 238 | {"Asia/Chita", "<+09>-9"}, 239 | {"Asia/Choibalsan", "<+08>-8"}, 240 | {"Asia/Colombo", "<+0530>-5:30"}, 241 | {"Asia/Damascus", "<+03>-3"}, 242 | {"Asia/Dhaka", "<+06>-6"}, 243 | {"Asia/Dili", "<+09>-9"}, 244 | {"Asia/Dubai", "<+04>-4"}, 245 | {"Asia/Dushanbe", "<+05>-5"}, 246 | {"Asia/Famagusta", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 247 | {"Asia/Gaza", "EET-2EEST,M3.4.4/50,M10.4.4/50"}, 248 | {"Asia/Hebron", "EET-2EEST,M3.4.4/50,M10.4.4/50"}, 249 | {"Asia/Ho_Chi_Minh", "<+07>-7"}, 250 | {"Asia/Hong_Kong", "HKT-8"}, 251 | {"Asia/Hovd", "<+07>-7"}, 252 | {"Asia/Irkutsk", "<+08>-8"}, 253 | {"Asia/Jakarta", "WIB-7"}, 254 | {"Asia/Jayapura", "WIT-9"}, 255 | {"Asia/Jerusalem", "IST-2IDT,M3.4.4/26,M10.5.0"}, 256 | {"Asia/Kabul", "<+0430>-4:30"}, 257 | {"Asia/Kamchatka", "<+12>-12"}, 258 | {"Asia/Karachi", "PKT-5"}, 259 | {"Asia/Kathmandu", "<+0545>-5:45"}, 260 | {"Asia/Khandyga", "<+09>-9"}, 261 | {"Asia/Kolkata", "IST-5:30"}, 262 | {"Asia/Krasnoyarsk", "<+07>-7"}, 263 | {"Asia/Kuala_Lumpur", "<+08>-8"}, 264 | {"Asia/Kuching", "<+08>-8"}, 265 | {"Asia/Kuwait", "<+03>-3"}, 266 | {"Asia/Macau", "CST-8"}, 267 | {"Asia/Magadan", "<+11>-11"}, 268 | {"Asia/Makassar", "WITA-8"}, 269 | {"Asia/Manila", "PST-8"}, 270 | {"Asia/Muscat", "<+04>-4"}, 271 | {"Asia/Nicosia", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 272 | {"Asia/Novokuznetsk", "<+07>-7"}, 273 | {"Asia/Novosibirsk", "<+07>-7"}, 274 | {"Asia/Omsk", "<+06>-6"}, 275 | {"Asia/Oral", "<+05>-5"}, 276 | {"Asia/Phnom_Penh", "<+07>-7"}, 277 | {"Asia/Pontianak", "WIB-7"}, 278 | {"Asia/Pyongyang", "KST-9"}, 279 | {"Asia/Qatar", "<+03>-3"}, 280 | {"Asia/Qyzylorda", "<+05>-5"}, 281 | {"Asia/Riyadh", "<+03>-3"}, 282 | {"Asia/Sakhalin", "<+11>-11"}, 283 | {"Asia/Samarkand", "<+05>-5"}, 284 | {"Asia/Seoul", "KST-9"}, 285 | {"Asia/Shanghai", "CST-8"}, 286 | {"Asia/Singapore", "<+08>-8"}, 287 | {"Asia/Srednekolymsk", "<+11>-11"}, 288 | {"Asia/Taipei", "CST-8"}, 289 | {"Asia/Tashkent", "<+05>-5"}, 290 | {"Asia/Tbilisi", "<+04>-4"}, 291 | {"Asia/Tehran", "<+0330>-3:30"}, 292 | {"Asia/Thimphu", "<+06>-6"}, 293 | {"Asia/Tokyo", "JST-9"}, 294 | {"Asia/Tomsk", "<+07>-7"}, 295 | {"Asia/Ulaanbaatar", "<+08>-8"}, 296 | {"Asia/Urumqi", "<+06>-6"}, 297 | {"Asia/Ust-Nera", "<+10>-10"}, 298 | {"Asia/Vientiane", "<+07>-7"}, 299 | {"Asia/Vladivostok", "<+10>-10"}, 300 | {"Asia/Yakutsk", "<+09>-9"}, 301 | {"Asia/Yangon", "<+0630>-6:30"}, 302 | {"Asia/Yekaterinburg", "<+05>-5"}, 303 | {"Asia/Yerevan", "<+04>-4"}, 304 | {"Atlantic/Azores", "<-01>1<+00>,M3.5.0/0,M10.5.0/1"}, 305 | {"Atlantic/Bermuda", "AST4ADT,M3.2.0,M11.1.0"}, 306 | {"Atlantic/Canary", "WET0WEST,M3.5.0/1,M10.5.0"}, 307 | {"Atlantic/Cape_Verde", "<-01>1"}, 308 | {"Atlantic/Faroe", "WET0WEST,M3.5.0/1,M10.5.0"}, 309 | {"Atlantic/Madeira", "WET0WEST,M3.5.0/1,M10.5.0"}, 310 | {"Atlantic/Reykjavik", "GMT0"}, 311 | {"Atlantic/South_Georgia", "<-02>2"}, 312 | {"Atlantic/Stanley", "<-03>3"}, 313 | {"Atlantic/St_Helena", "GMT0"}, 314 | {"Australia/Adelaide", "ACST-9:30ACDT,M10.1.0,M4.1.0/3"}, 315 | {"Australia/Brisbane", "AEST-10"}, 316 | {"Australia/Broken_Hill", "ACST-9:30ACDT,M10.1.0,M4.1.0/3"}, 317 | {"Australia/Currie", "AEST-10AEDT,M10.1.0,M4.1.0/3"}, 318 | {"Australia/Darwin", "ACST-9:30"}, 319 | {"Australia/Eucla", "<+0845>-8:45"}, 320 | {"Australia/Hobart", "AEST-10AEDT,M10.1.0,M4.1.0/3"}, 321 | {"Australia/Lindeman", "AEST-10"}, 322 | {"Australia/Lord_Howe", "<+1030>-10:30<+11>-11,M10.1.0,M4.1.0"}, 323 | {"Australia/Melbourne", "AEST-10AEDT,M10.1.0,M4.1.0/3"}, 324 | {"Australia/Perth", "AWST-8"}, 325 | {"Australia/Sydney", "AEST-10AEDT,M10.1.0,M4.1.0/3"}, 326 | {"Europe/Amsterdam", "CET-1CEST,M3.5.0,M10.5.0/3"}, 327 | {"Europe/Andorra", "CET-1CEST,M3.5.0,M10.5.0/3"}, 328 | {"Europe/Astrakhan", "<+04>-4"}, 329 | {"Europe/Athens", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 330 | {"Europe/Belgrade", "CET-1CEST,M3.5.0,M10.5.0/3"}, 331 | {"Europe/Berlin", "CET-1CEST,M3.5.0,M10.5.0/3"}, 332 | {"Europe/Bratislava", "CET-1CEST,M3.5.0,M10.5.0/3"}, 333 | {"Europe/Brussels", "CET-1CEST,M3.5.0,M10.5.0/3"}, 334 | {"Europe/Bucharest", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 335 | {"Europe/Budapest", "CET-1CEST,M3.5.0,M10.5.0/3"}, 336 | {"Europe/Busingen", "CET-1CEST,M3.5.0,M10.5.0/3"}, 337 | {"Europe/Chisinau", "EET-2EEST,M3.5.0,M10.5.0/3"}, 338 | {"Europe/Copenhagen", "CET-1CEST,M3.5.0,M10.5.0/3"}, 339 | {"Europe/Dublin", "IST-1GMT0,M10.5.0,M3.5.0/1"}, 340 | {"Europe/Gibraltar", "CET-1CEST,M3.5.0,M10.5.0/3"}, 341 | {"Europe/Guernsey", "GMT0BST,M3.5.0/1,M10.5.0"}, 342 | {"Europe/Helsinki", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 343 | {"Europe/Isle_of_Man", "GMT0BST,M3.5.0/1,M10.5.0"}, 344 | {"Europe/Istanbul", "<+03>-3"}, 345 | {"Europe/Jersey", "GMT0BST,M3.5.0/1,M10.5.0"}, 346 | {"Europe/Kaliningrad", "EET-2"}, 347 | {"Europe/Kiev", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 348 | {"Europe/Kirov", "MSK-3"}, 349 | {"Europe/Lisbon", "WET0WEST,M3.5.0/1,M10.5.0"}, 350 | {"Europe/Ljubljana", "CET-1CEST,M3.5.0,M10.5.0/3"}, 351 | {"Europe/London", "GMT0BST,M3.5.0/1,M10.5.0"}, 352 | {"Europe/Luxembourg", "CET-1CEST,M3.5.0,M10.5.0/3"}, 353 | {"Europe/Madrid", "CET-1CEST,M3.5.0,M10.5.0/3"}, 354 | {"Europe/Malta", "CET-1CEST,M3.5.0,M10.5.0/3"}, 355 | {"Europe/Mariehamn", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 356 | {"Europe/Minsk", "<+03>-3"}, 357 | {"Europe/Monaco", "CET-1CEST,M3.5.0,M10.5.0/3"}, 358 | {"Europe/Moscow", "MSK-3"}, 359 | {"Europe/Oslo", "CET-1CEST,M3.5.0,M10.5.0/3"}, 360 | {"Europe/Paris", "CET-1CEST,M3.5.0,M10.5.0/3"}, 361 | {"Europe/Podgorica", "CET-1CEST,M3.5.0,M10.5.0/3"}, 362 | {"Europe/Prague", "CET-1CEST,M3.5.0,M10.5.0/3"}, 363 | {"Europe/Riga", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 364 | {"Europe/Rome", "CET-1CEST,M3.5.0,M10.5.0/3"}, 365 | {"Europe/Samara", "<+04>-4"}, 366 | {"Europe/San_Marino", "CET-1CEST,M3.5.0,M10.5.0/3"}, 367 | {"Europe/Sarajevo", "CET-1CEST,M3.5.0,M10.5.0/3"}, 368 | {"Europe/Saratov", "<+04>-4"}, 369 | {"Europe/Simferopol", "MSK-3"}, 370 | {"Europe/Skopje", "CET-1CEST,M3.5.0,M10.5.0/3"}, 371 | {"Europe/Sofia", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 372 | {"Europe/Stockholm", "CET-1CEST,M3.5.0,M10.5.0/3"}, 373 | {"Europe/Tallinn", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 374 | {"Europe/Tirane", "CET-1CEST,M3.5.0,M10.5.0/3"}, 375 | {"Europe/Ulyanovsk", "<+04>-4"}, 376 | {"Europe/Uzhgorod", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 377 | {"Europe/Vaduz", "CET-1CEST,M3.5.0,M10.5.0/3"}, 378 | {"Europe/Vatican", "CET-1CEST,M3.5.0,M10.5.0/3"}, 379 | {"Europe/Vienna", "CET-1CEST,M3.5.0,M10.5.0/3"}, 380 | {"Europe/Vilnius", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 381 | {"Europe/Volgograd", "MSK-3"}, 382 | {"Europe/Warsaw", "CET-1CEST,M3.5.0,M10.5.0/3"}, 383 | {"Europe/Zagreb", "CET-1CEST,M3.5.0,M10.5.0/3"}, 384 | {"Europe/Zaporozhye", "EET-2EEST,M3.5.0/3,M10.5.0/4"}, 385 | {"Europe/Zurich", "CET-1CEST,M3.5.0,M10.5.0/3"}, 386 | {"Indian/Antananarivo", "EAT-3"}, 387 | {"Indian/Chagos", "<+06>-6"}, 388 | {"Indian/Christmas", "<+07>-7"}, 389 | {"Indian/Cocos", "<+0630>-6:30"}, 390 | {"Indian/Comoro", "EAT-3"}, 391 | {"Indian/Kerguelen", "<+05>-5"}, 392 | {"Indian/Mahe", "<+04>-4"}, 393 | {"Indian/Maldives", "<+05>-5"}, 394 | {"Indian/Mauritius", "<+04>-4"}, 395 | {"Indian/Mayotte", "EAT-3"}, 396 | {"Indian/Reunion", "<+04>-4"}, 397 | {"Pacific/Apia", "<+13>-13"}, 398 | {"Pacific/Auckland", "NZST-12NZDT,M9.5.0,M4.1.0/3"}, 399 | {"Pacific/Bougainville", "<+11>-11"}, 400 | {"Pacific/Chatham", "<+1245>-12:45<+1345>,M9.5.0/2:45,M4.1.0/3:45"}, 401 | {"Pacific/Chuuk", "<+10>-10"}, 402 | {"Pacific/Easter", "<-06>6<-05>,M9.1.6/22,M4.1.6/22"}, 403 | {"Pacific/Efate", "<+11>-11"}, 404 | {"Pacific/Enderbury", "<+13>-13"}, 405 | {"Pacific/Fakaofo", "<+13>-13"}, 406 | {"Pacific/Fiji", "<+12>-12"}, 407 | {"Pacific/Funafuti", "<+12>-12"}, 408 | {"Pacific/Galapagos", "<-06>6"}, 409 | {"Pacific/Gambier", "<-09>9"}, 410 | {"Pacific/Guadalcanal", "<+11>-11"}, 411 | {"Pacific/Guam", "ChST-10"}, 412 | {"Pacific/Honolulu", "HST10"}, 413 | {"Pacific/Kiritimati", "<+14>-14"}, 414 | {"Pacific/Kosrae", "<+11>-11"}, 415 | {"Pacific/Kwajalein", "<+12>-12"}, 416 | {"Pacific/Majuro", "<+12>-12"}, 417 | {"Pacific/Marquesas", "<-0930>9:30"}, 418 | {"Pacific/Midway", "SST11"}, 419 | {"Pacific/Nauru", "<+12>-12"}, 420 | {"Pacific/Niue", "<-11>11"}, 421 | {"Pacific/Norfolk", "<+11>-11<+12>,M10.1.0,M4.1.0/3"}, 422 | {"Pacific/Noumea", "<+11>-11"}, 423 | {"Pacific/Pago_Pago", "SST11"}, 424 | {"Pacific/Palau", "<+09>-9"}, 425 | {"Pacific/Pitcairn", "<-08>8"}, 426 | {"Pacific/Pohnpei", "<+11>-11"}, 427 | {"Pacific/Port_Moresby", "<+10>-10"}, 428 | {"Pacific/Rarotonga", "<-10>10"}, 429 | {"Pacific/Saipan", "ChST-10"}, 430 | {"Pacific/Tahiti", "<-10>10"}, 431 | {"Pacific/Tarawa", "<+12>-12"}, 432 | {"Pacific/Tongatapu", "<+13>-13"}, 433 | {"Pacific/Wake", "<+12>-12"}, 434 | {"Pacific/Wallis", "<+12>-12"} 435 | }; 436 | 437 | static char lower(char start) { 438 | if ('A' <= start && start <= 'Z') { 439 | return start - 'A' + 'a'; 440 | } 441 | return start; 442 | } 443 | 444 | /** 445 | * Basically strcmp, but accounting for spaces that have become underscores 446 | * @param[in] target - the 0-terminated string on the left hand side of the comparison 447 | * @param[in] other - the 0-terminated string on the right hand side of the comparison 448 | * @return > 0 if target comes before other alphabetically, 449 | * ==0 if they're the same, 450 | * < 0 if other comes before target alphabetically 451 | * (we don't expect NULL arguments, but, -1 if either is NULL) 452 | **/ 453 | static int tz_name_cmp(const char * target, const char * other) { 454 | if (!target || !other) { 455 | return -1; 456 | } 457 | 458 | while (*target) { 459 | if (lower(*target) != lower(*other)) { 460 | break; 461 | } 462 | do { 463 | target++; 464 | } while (*target == '_'); 465 | do { 466 | other++; 467 | } while (*other == '_'); 468 | } 469 | 470 | return lower(*target) - lower(*other); 471 | } 472 | 473 | const char *micro_tz_db_get_posix_str(const char *name) { 474 | int lo = 0, hi = sizeof(micro_tz_db_tzs) / sizeof(micro_tz_db_pair); 475 | while (lo < hi) { 476 | int mid = (lo + hi) / 2; 477 | micro_tz_db_pair mid_pair = micro_tz_db_tzs[mid]; 478 | int comparison = tz_name_cmp(name, mid_pair.name); 479 | if (comparison == 0) { 480 | return mid_pair.posix_str; 481 | } else if (comparison < 0) { 482 | hi = mid; 483 | } else { 484 | lo = mid + 1; 485 | } 486 | } 487 | return NULL; 488 | } 489 | --------------------------------------------------------------------------------