1(function (root) {/*global exports, Intl*/ 2/** 3 * This script gives you the zone info key representing your device's time zone setting. 4 * 5 * @name jsTimezoneDetect 6 * @version 1.0.5 7 * @author Jon Nylander 8 * @license MIT License - https://bitbucket.org/pellepim/jstimezonedetect/src/default/LICENCE.txt 9 * 10 * For usage and examples, visit: 11 * http://pellepim.bitbucket.org/jstz/ 12 * 13 * Copyright (c) Jon Nylander 14 */ 15 16 17/** 18 * Namespace to hold all the code for timezone detection. 19 */ 20var jstz = (function () { 21 'use strict'; 22 var HEMISPHERE_SOUTH = 's', 23 24 consts = { 25 DAY: 86400000, 26 HOUR: 3600000, 27 MINUTE: 60000, 28 SECOND: 1000, 29 BASELINE_YEAR: 2014, 30 MAX_SCORE: 864000000, // 10 days 31 AMBIGUITIES: { 32 'America/Denver': ['America/Mazatlan'], 33 'America/Chicago': ['America/Mexico_City'], 34 'America/Santiago': ['America/Asuncion', 'America/Campo_Grande'], 35 'America/Montevideo': ['America/Sao_Paulo'], 36 // Europe/Minsk should not be in this list... but Windows. 37 'Asia/Beirut': ['Asia/Amman', 'Asia/Jerusalem', 'Europe/Helsinki', 'Asia/Damascus', 'Africa/Cairo', 'Asia/Gaza', 'Europe/Minsk'], 38 'Pacific/Auckland': ['Pacific/Fiji'], 39 'America/Los_Angeles': ['America/Santa_Isabel'], 40 'America/New_York': ['America/Havana'], 41 'America/Halifax': ['America/Goose_Bay'], 42 'America/Godthab': ['America/Miquelon'], 43 'Asia/Dubai': ['Asia/Yerevan'], 44 'Asia/Jakarta': ['Asia/Krasnoyarsk'], 45 'Asia/Shanghai': ['Asia/Irkutsk', 'Australia/Perth'], 46 'Australia/Sydney': ['Australia/Lord_Howe'], 47 'Asia/Tokyo': ['Asia/Yakutsk'], 48 'Asia/Dhaka': ['Asia/Omsk'], 49 // In the real world Yerevan is not ambigous for Baku... but Windows. 50 'Asia/Baku': ['Asia/Yerevan'], 51 'Australia/Brisbane': ['Asia/Vladivostok'], 52 'Pacific/Noumea': ['Asia/Vladivostok'], 53 'Pacific/Majuro': ['Asia/Kamchatka', 'Pacific/Fiji'], 54 'Pacific/Tongatapu': ['Pacific/Apia'], 55 'Asia/Baghdad': ['Europe/Minsk', 'Europe/Moscow'], 56 'Asia/Karachi': ['Asia/Yekaterinburg'], 57 'Africa/Johannesburg': ['Asia/Gaza', 'Africa/Cairo'] 58 } 59 }, 60 61 /** 62 * Gets the offset in minutes from UTC for a certain date. 63 * @param {Date} date 64 * @returns {Number} 65 */ 66 get_date_offset = function get_date_offset(date) { 67 var offset = -date.getTimezoneOffset(); 68 return (offset !== null ? offset : 0); 69 }, 70 71 /** 72 * This function does some basic calculations to create information about 73 * the user's timezone. It uses REFERENCE_YEAR as a solid year for which 74 * the script has been tested rather than depend on the year set by the 75 * client device. 76 * 77 * Returns a key that can be used to do lookups in jstz.olson.timezones. 78 * eg: "720,1,2". 79 * 80 * @returns {String} 81 */ 82 lookup_key = function lookup_key() { 83 var january_offset = get_date_offset(new Date(consts.BASELINE_YEAR, 0, 2)), 84 june_offset = get_date_offset(new Date(consts.BASELINE_YEAR, 5, 2)), 85 diff = january_offset - june_offset; 86 87 if (diff < 0) { 88 return january_offset + ",1"; 89 } else if (diff > 0) { 90 return june_offset + ",1," + HEMISPHERE_SOUTH; 91 } 92 93 return january_offset + ",0"; 94 }, 95 96 97 /** 98 * Tries to get the time zone key directly from the operating system for those 99 * environments that support the ECMAScript Internationalization API. 100 */ 101 get_from_internationalization_api = function get_from_internationalization_api() { 102 if (typeof Intl === "undefined" || typeof Intl.DateTimeFormat === "undefined") { 103 return; 104 } 105 var format = Intl.DateTimeFormat(); 106 if (typeof format === "undefined" || typeof format.resolvedOptions === "undefined") { 107 return; 108 } 109 return format.resolvedOptions().timeZone; 110 }, 111 112 /** 113 * Starting point for getting all the DST rules for a specific year 114 * for the current timezone (as described by the client system). 115 * 116 * Returns an object with start and end attributes, or false if no 117 * DST rules were found for the year. 118 * 119 * @param year 120 * @returns {Object} || {Boolean} 121 */ 122 dst_dates = function dst_dates(year) { 123 var yearstart = new Date(year, 0, 1, 0, 0, 1, 0).getTime(); 124 var yearend = new Date(year, 12, 31, 23, 59, 59).getTime(); 125 var current = yearstart; 126 var offset = (new Date(current)).getTimezoneOffset(); 127 var dst_start = null; 128 var dst_end = null; 129 130 while (current < yearend - 86400000) { 131 var dateToCheck = new Date(current); 132 var dateToCheckOffset = dateToCheck.getTimezoneOffset(); 133 134 if (dateToCheckOffset !== offset) { 135 if (dateToCheckOffset < offset) { 136 dst_start = dateToCheck; 137 } 138 if (dateToCheckOffset > offset) { 139 dst_end = dateToCheck; 140 } 141 offset = dateToCheckOffset; 142 } 143 144 current += 86400000; 145 } 146 147 if (dst_start && dst_end) { 148 return { 149 s: find_dst_fold(dst_start).getTime(), 150 e: find_dst_fold(dst_end).getTime() 151 }; 152 } 153 154 return false; 155 }, 156 157 /** 158 * Probably completely unnecessary function that recursively finds the 159 * exact (to the second) time when a DST rule was changed. 160 * 161 * @param a_date - The candidate Date. 162 * @param padding - integer specifying the padding to allow around the candidate 163 * date for finding the fold. 164 * @param iterator - integer specifying how many milliseconds to iterate while 165 * searching for the fold. 166 * 167 * @returns {Date} 168 */ 169 find_dst_fold = function find_dst_fold(a_date, padding, iterator) { 170 if (typeof padding === 'undefined') { 171 padding = consts.DAY; 172 iterator = consts.HOUR; 173 } 174 175 var date_start = new Date(a_date.getTime() - padding).getTime(); 176 var date_end = a_date.getTime() + padding; 177 var offset = new Date(date_start).getTimezoneOffset(); 178 179 var current = date_start; 180 181 var dst_change = null; 182 while (current < date_end - iterator) { 183 var dateToCheck = new Date(current); 184 var dateToCheckOffset = dateToCheck.getTimezoneOffset(); 185 186 if (dateToCheckOffset !== offset) { 187 dst_change = dateToCheck; 188 break; 189 } 190 current += iterator; 191 } 192 193 if (padding === consts.DAY) { 194 return find_dst_fold(dst_change, consts.HOUR, consts.MINUTE); 195 } 196 197 if (padding === consts.HOUR) { 198 return find_dst_fold(dst_change, consts.MINUTE, consts.SECOND); 199 } 200 201 return dst_change; 202 }, 203 204 windows7_adaptations = function windows7_adaptions(rule_list, preliminary_timezone, score, sample) { 205 if (score !== 'N/A') { 206 return score; 207 } 208 if (preliminary_timezone === 'Asia/Beirut') { 209 if (sample.name === 'Africa/Cairo') { 210 if (rule_list[6].s === 1398376800000 && rule_list[6].e === 1411678800000) { 211 return 0; 212 } 213 } 214 if (sample.name === 'Asia/Jerusalem') { 215 if (rule_list[6].s === 1395964800000 && rule_list[6].e === 1411858800000) { 216 return 0; 217 } 218 } 219 } else if (preliminary_timezone === 'America/Santiago') { 220 if (sample.name === 'America/Asuncion') { 221 if (rule_list[6].s === 1412481600000 && rule_list[6].e === 1397358000000) { 222 return 0; 223 } 224 } 225 if (sample.name === 'America/Campo_Grande') { 226 if (rule_list[6].s === 1413691200000 && rule_list[6].e === 1392519600000) { 227 return 0; 228 } 229 } 230 } else if (preliminary_timezone === 'America/Montevideo') { 231 if (sample.name === 'America/Sao_Paulo') { 232 if (rule_list[6].s === 1413687600000 && rule_list[6].e === 1392516000000) { 233 return 0; 234 } 235 } 236 } else if (preliminary_timezone === 'Pacific/Auckland') { 237 if (sample.name === 'Pacific/Fiji') { 238 if (rule_list[6].s === 1414245600000 && rule_list[6].e === 1396101600000) { 239 return 0; 240 } 241 } 242 } 243 244 return score; 245 }, 246 247 /** 248 * Takes the DST rules for the current timezone, and proceeds to find matches 249 * in the jstz.olson.dst_rules.zones array. 250 * 251 * Compares samples to the current timezone on a scoring basis. 252 * 253 * Candidates are ruled immediately if either the candidate or the current zone 254 * has a DST rule where the other does not. 255 * 256 * Candidates are ruled out immediately if the current zone has a rule that is 257 * outside the DST scope of the candidate. 258 * 259 * Candidates are included for scoring if the current zones rules fall within the 260 * span of the samples rules. 261 * 262 * Low score is best, the score is calculated by summing up the differences in DST 263 * rules and if the consts.MAX_SCORE is overreached the candidate is ruled out. 264 * 265 * Yah follow? :) 266 * 267 * @param rule_list 268 * @param preliminary_timezone 269 * @returns {*} 270 */ 271 best_dst_match = function best_dst_match(rule_list, preliminary_timezone) { 272 var score_sample = function score_sample(sample) { 273 var score = 0; 274 275 for (var j = 0; j < rule_list.length; j++) { 276 277 // Both sample and current time zone report DST during the year. 278 if (!!sample.rules[j] && !!rule_list[j]) { 279 280 // The current time zone's DST rules are inside the sample's. Include. 281 if (rule_list[j].s >= sample.rules[j].s && rule_list[j].e <= sample.rules[j].e) { 282 score = 0; 283 score += Math.abs(rule_list[j].s - sample.rules[j].s); 284 score += Math.abs(sample.rules[j].e - rule_list[j].e); 285 286 // The current time zone's DST rules are outside the sample's. Discard. 287 } else { 288 score = 'N/A'; 289 break; 290 } 291 292 // The max score has been reached. Discard. 293 if (score > consts.MAX_SCORE) { 294 score = 'N/A'; 295 break; 296 } 297 } 298 } 299 300 score = windows7_adaptations(rule_list, preliminary_timezone, score, sample); 301 302 return score; 303 }; 304 var scoreboard = {}; 305 var dst_zones = jstz.olson.dst_rules.zones; 306 var dst_zones_length = dst_zones.length; 307 var ambiguities = consts.AMBIGUITIES[preliminary_timezone]; 308 309 for (var i = 0; i < dst_zones_length; i++) { 310 var sample = dst_zones[i]; 311 var score = score_sample(dst_zones[i]); 312 313 if (score !== 'N/A') { 314 scoreboard[sample.name] = score; 315 } 316 } 317 318 for (var tz in scoreboard) { 319 if (scoreboard.hasOwnProperty(tz)) { 320 if (ambiguities.indexOf(tz) != -1) { 321 return tz; 322 } 323 } 324 } 325 326 return preliminary_timezone; 327 }, 328 329 /** 330 * Takes the preliminary_timezone as detected by lookup_key(). 331 * 332 * Builds up the current timezones DST rules for the years defined 333 * in the jstz.olson.dst_rules.years array. 334 * 335 * If there are no DST occurences for those years, immediately returns 336 * the preliminary timezone. Otherwise proceeds and tries to solve 337 * ambiguities. 338 * 339 * @param preliminary_timezone 340 * @returns {String} timezone_name 341 */ 342 get_by_dst = function get_by_dst(preliminary_timezone) { 343 var get_rules = function get_rules() { 344 var rule_list = []; 345 for (var i = 0; i < jstz.olson.dst_rules.years.length; i++) { 346 var year_rules = dst_dates(jstz.olson.dst_rules.years[i]); 347 rule_list.push(year_rules); 348 } 349 return rule_list; 350 }; 351 var check_has_dst = function check_has_dst(rules) { 352 for (var i = 0; i < rules.length; i++) { 353 if (rules[i] !== false) { 354 return true; 355 } 356 } 357 return false; 358 }; 359 var rules = get_rules(); 360 var has_dst = check_has_dst(rules); 361 362 if (has_dst) { 363 return best_dst_match(rules, preliminary_timezone); 364 } 365 366 return preliminary_timezone; 367 }, 368 369 /** 370 * Uses get_timezone_info() to formulate a key to use in the olson.timezones dictionary. 371 * 372 * Returns an object with one function ".name()" 373 * 374 * @returns Object 375 */ 376 determine = function determine() { 377 var preliminary_tz = get_from_internationalization_api(); 378 379 if (!preliminary_tz) { 380 preliminary_tz = jstz.olson.timezones[lookup_key()]; 381 382 if (typeof consts.AMBIGUITIES[preliminary_tz] !== 'undefined') { 383 preliminary_tz = get_by_dst(preliminary_tz); 384 } 385 } 386 387 return { 388 name: function () { 389 return preliminary_tz; 390 } 391 }; 392 }; 393 394 return { 395 determine: determine 396 }; 397}()); 398 399 400jstz.olson = jstz.olson || {}; 401 402/** 403 * The keys in this dictionary are comma separated as such: 404 * 405 * First the offset compared to UTC time in minutes. 406 * 407 * Then a flag which is 0 if the timezone does not take daylight savings into account and 1 if it 408 * does. 409 * 410 * Thirdly an optional 's' signifies that the timezone is in the southern hemisphere, 411 * only interesting for timezones with DST. 412 * 413 * The mapped arrays is used for constructing the jstz.TimeZone object from within 414 * jstz.determine(); 415 */ 416jstz.olson.timezones = { 417 '-720,0': 'Etc/GMT+12', 418 '-660,0': 'Pacific/Pago_Pago', 419 '-660,1,s': 'Pacific/Apia', // Why? Because windows... cry! 420 '-600,1': 'America/Adak', 421 '-600,0': 'Pacific/Honolulu', 422 '-570,0': 'Pacific/Marquesas', 423 '-540,0': 'Pacific/Gambier', 424 '-540,1': 'America/Anchorage', 425 '-480,1': 'America/Los_Angeles', 426 '-480,0': 'Pacific/Pitcairn', 427 '-420,0': 'America/Phoenix', 428 '-420,1': 'America/Denver', 429 '-360,0': 'America/Guatemala', 430 '-360,1': 'America/Chicago', 431 '-360,1,s': 'Pacific/Easter', 432 '-300,0': 'America/Bogota', 433 '-300,1': 'America/New_York', 434 '-270,0': 'America/Caracas', 435 '-240,1': 'America/Halifax', 436 '-240,0': 'America/Santo_Domingo', 437 '-240,1,s': 'America/Santiago', 438 '-210,1': 'America/St_Johns', 439 '-180,1': 'America/Godthab', 440 '-180,0': 'America/Argentina/Buenos_Aires', 441 '-180,1,s': 'America/Montevideo', 442 '-120,0': 'America/Noronha', 443 '-120,1': 'America/Noronha', 444 '-60,1': 'Atlantic/Azores', 445 '-60,0': 'Atlantic/Cape_Verde', 446 '0,0': 'UTC', 447 '0,1': 'Europe/London', 448 '60,1': 'Europe/Berlin', 449 '60,0': 'Africa/Lagos', 450 '60,1,s': 'Africa/Windhoek', 451 '120,1': 'Asia/Beirut', 452 '120,0': 'Africa/Johannesburg', 453 '180,0': 'Asia/Baghdad', 454 '180,1': 'Europe/Moscow', 455 '210,1': 'Asia/Tehran', 456 '240,0': 'Asia/Dubai', 457 '240,1': 'Asia/Baku', 458 '270,0': 'Asia/Kabul', 459 '300,1': 'Asia/Yekaterinburg', 460 '300,0': 'Asia/Karachi', 461 '330,0': 'Asia/Kolkata', 462 '345,0': 'Asia/Kathmandu', 463 '360,0': 'Asia/Dhaka', 464 '360,1': 'Asia/Omsk', 465 '390,0': 'Asia/Rangoon', 466 '420,1': 'Asia/Krasnoyarsk', 467 '420,0': 'Asia/Jakarta', 468 '480,0': 'Asia/Shanghai', 469 '480,1': 'Asia/Irkutsk', 470 '525,0': 'Australia/Eucla', 471 '525,1,s': 'Australia/Eucla', 472 '540,1': 'Asia/Yakutsk', 473 '540,0': 'Asia/Tokyo', 474 '570,0': 'Australia/Darwin', 475 '570,1,s': 'Australia/Adelaide', 476 '600,0': 'Australia/Brisbane', 477 '600,1': 'Asia/Vladivostok', 478 '600,1,s': 'Australia/Sydney', 479 '630,1,s': 'Australia/Lord_Howe', 480 '660,1': 'Asia/Kamchatka', 481 '660,0': 'Pacific/Noumea', 482 '690,0': 'Pacific/Norfolk', 483 '720,1,s': 'Pacific/Auckland', 484 '720,0': 'Pacific/Majuro', 485 '765,1,s': 'Pacific/Chatham', 486 '780,0': 'Pacific/Tongatapu', 487 '780,1,s': 'Pacific/Apia', 488 '840,0': 'Pacific/Kiritimati' 489}; 490 491/* Build time: 2014-11-28 11:10:50Z Build by invoking python utilities/dst.py generate */ 492jstz.olson.dst_rules = { 493 "years": [ 494 2008, 495 2009, 496 2010, 497 2011, 498 2012, 499 2013, 500 2014 501 ], 502 "zones": [ 503 { 504 "name": "Africa/Cairo", 505 "rules": [ 506 { 507 "e": 1219957200000, 508 "s": 1209074400000 509 }, 510 { 511 "e": 1250802000000, 512 "s": 1240524000000 513 }, 514 { 515 "e": 1285880400000, 516 "s": 1284069600000 517 }, 518 false, 519 false, 520 false, 521 { 522 "e": 1411678800000, 523 "s": 1406844000000 524 } 525 ] 526 }, 527 { 528 "name": "America/Asuncion", 529 "rules": [ 530 { 531 "e": 1205031600000, 532 "s": 1224388800000 533 }, 534 { 535 "e": 1236481200000, 536 "s": 1255838400000 537 }, 538 { 539 "e": 1270954800000, 540 "s": 1286078400000 541 }, 542 { 543 "e": 1302404400000, 544 "s": 1317528000000 545 }, 546 { 547 "e": 1333854000000, 548 "s": 1349582400000 549 }, 550 { 551 "e": 1364094000000, 552 "s": 1381032000000 553 }, 554 { 555 "e": 1395543600000, 556 "s": 1412481600000 557 } 558 ] 559 }, 560 { 561 "name": "America/Campo_Grande", 562 "rules": [ 563 { 564 "e": 1203217200000, 565 "s": 1224388800000 566 }, 567 { 568 "e": 1234666800000, 569 "s": 1255838400000 570 }, 571 { 572 "e": 1266721200000, 573 "s": 1287288000000 574 }, 575 { 576 "e": 1298170800000, 577 "s": 1318737600000 578 }, 579 { 580 "e": 1330225200000, 581 "s": 1350792000000 582 }, 583 { 584 "e": 1361070000000, 585 "s": 1382241600000 586 }, 587 { 588 "e": 1392519600000, 589 "s": 1413691200000 590 } 591 ] 592 }, 593 { 594 "name": "America/Goose_Bay", 595 "rules": [ 596 { 597 "e": 1225594860000, 598 "s": 1205035260000 599 }, 600 { 601 "e": 1257044460000, 602 "s": 1236484860000 603 }, 604 { 605 "e": 1289098860000, 606 "s": 1268539260000 607 }, 608 { 609 "e": 1320555600000, 610 "s": 1299988860000 611 }, 612 { 613 "e": 1352005200000, 614 "s": 1331445600000 615 }, 616 { 617 "e": 1383454800000, 618 "s": 1362895200000 619 }, 620 { 621 "e": 1414904400000, 622 "s": 1394344800000 623 } 624 ] 625 }, 626 { 627 "name": "America/Havana", 628 "rules": [ 629 { 630 "e": 1224997200000, 631 "s": 1205643600000 632 }, 633 { 634 "e": 1256446800000, 635 "s": 1236488400000 636 }, 637 { 638 "e": 1288501200000, 639 "s": 1268542800000 640 }, 641 { 642 "e": 1321160400000, 643 "s": 1300597200000 644 }, 645 { 646 "e": 1352005200000, 647 "s": 1333256400000 648 }, 649 { 650 "e": 1383454800000, 651 "s": 1362891600000 652 }, 653 { 654 "e": 1414904400000, 655 "s": 1394341200000 656 } 657 ] 658 }, 659 { 660 "name": "America/Mazatlan", 661 "rules": [ 662 { 663 "e": 1225008000000, 664 "s": 1207472400000 665 }, 666 { 667 "e": 1256457600000, 668 "s": 1238922000000 669 }, 670 { 671 "e": 1288512000000, 672 "s": 1270371600000 673 }, 674 { 675 "e": 1319961600000, 676 "s": 1301821200000 677 }, 678 { 679 "e": 1351411200000, 680 "s": 1333270800000 681 }, 682 { 683 "e": 1382860800000, 684 "s": 1365325200000 685 }, 686 { 687 "e": 1414310400000, 688 "s": 1396774800000 689 } 690 ] 691 }, 692 { 693 "name": "America/Mexico_City", 694 "rules": [ 695 { 696 "e": 1225004400000, 697 "s": 1207468800000 698 }, 699 { 700 "e": 1256454000000, 701 "s": 1238918400000 702 }, 703 { 704 "e": 1288508400000, 705 "s": 1270368000000 706 }, 707 { 708 "e": 1319958000000, 709 "s": 1301817600000 710 }, 711 { 712 "e": 1351407600000, 713 "s": 1333267200000 714 }, 715 { 716 "e": 1382857200000, 717 "s": 1365321600000 718 }, 719 { 720 "e": 1414306800000, 721 "s": 1396771200000 722 } 723 ] 724 }, 725 { 726 "name": "America/Miquelon", 727 "rules": [ 728 { 729 "e": 1225598400000, 730 "s": 1205038800000 731 }, 732 { 733 "e": 1257048000000, 734 "s": 1236488400000 735 }, 736 { 737 "e": 1289102400000, 738 "s": 1268542800000 739 }, 740 { 741 "e": 1320552000000, 742 "s": 1299992400000 743 }, 744 { 745 "e": 1352001600000, 746 "s": 1331442000000 747 }, 748 { 749 "e": 1383451200000, 750 "s": 1362891600000 751 }, 752 { 753 "e": 1414900800000, 754 "s": 1394341200000 755 } 756 ] 757 }, 758 { 759 "name": "America/Santa_Isabel", 760 "rules": [ 761 { 762 "e": 1225011600000, 763 "s": 1207476000000 764 }, 765 { 766 "e": 1256461200000, 767 "s": 1238925600000 768 }, 769 { 770 "e": 1288515600000, 771 "s": 1270375200000 772 }, 773 { 774 "e": 1319965200000, 775 "s": 1301824800000 776 }, 777 { 778 "e": 1351414800000, 779 "s": 1333274400000 780 }, 781 { 782 "e": 1382864400000, 783 "s": 1365328800000 784 }, 785 { 786 "e": 1414314000000, 787 "s": 1396778400000 788 } 789 ] 790 }, 791 { 792 "name": "America/Sao_Paulo", 793 "rules": [ 794 { 795 "e": 1203213600000, 796 "s": 1224385200000 797 }, 798 { 799 "e": 1234663200000, 800 "s": 1255834800000 801 }, 802 { 803 "e": 1266717600000, 804 "s": 1287284400000 805 }, 806 { 807 "e": 1298167200000, 808 "s": 1318734000000 809 }, 810 { 811 "e": 1330221600000, 812 "s": 1350788400000 813 }, 814 { 815 "e": 1361066400000, 816 "s": 1382238000000 817 }, 818 { 819 "e": 1392516000000, 820 "s": 1413687600000 821 } 822 ] 823 }, 824 { 825 "name": "Asia/Amman", 826 "rules": [ 827 { 828 "e": 1225404000000, 829 "s": 1206655200000 830 }, 831 { 832 "e": 1256853600000, 833 "s": 1238104800000 834 }, 835 { 836 "e": 1288303200000, 837 "s": 1269554400000 838 }, 839 { 840 "e": 1319752800000, 841 "s": 1301608800000 842 }, 843 false, 844 false, 845 { 846 "e": 1414706400000, 847 "s": 1395957600000 848 } 849 ] 850 }, 851 { 852 "name": "Asia/Damascus", 853 "rules": [ 854 { 855 "e": 1225486800000, 856 "s": 1207260000000 857 }, 858 { 859 "e": 1256850000000, 860 "s": 1238104800000 861 }, 862 { 863 "e": 1288299600000, 864 "s": 1270159200000 865 }, 866 { 867 "e": 1319749200000, 868 "s": 1301608800000 869 }, 870 { 871 "e": 1351198800000, 872 "s": 1333058400000 873 }, 874 { 875 "e": 1382648400000, 876 "s": 1364508000000 877 }, 878 { 879 "e": 1414702800000, 880 "s": 1395957600000 881 } 882 ] 883 }, 884 { 885 "name": "Asia/Dubai", 886 "rules": [ 887 false, 888 false, 889 false, 890 false, 891 false, 892 false, 893 false 894 ] 895 }, 896 { 897 "name": "Asia/Gaza", 898 "rules": [ 899 { 900 "e": 1219957200000, 901 "s": 1206655200000 902 }, 903 { 904 "e": 1252015200000, 905 "s": 1238104800000 906 }, 907 { 908 "e": 1281474000000, 909 "s": 1269640860000 910 }, 911 { 912 "e": 1312146000000, 913 "s": 1301608860000 914 }, 915 { 916 "e": 1348178400000, 917 "s": 1333058400000 918 }, 919 { 920 "e": 1380229200000, 921 "s": 1364508000000 922 }, 923 { 924 "e": 1411678800000, 925 "s": 1395957600000 926 } 927 ] 928 }, 929 { 930 "name": "Asia/Irkutsk", 931 "rules": [ 932 { 933 "e": 1224957600000, 934 "s": 1206813600000 935 }, 936 { 937 "e": 1256407200000, 938 "s": 1238263200000 939 }, 940 { 941 "e": 1288461600000, 942 "s": 1269712800000 943 }, 944 false, 945 false, 946 false, 947 false 948 ] 949 }, 950 { 951 "name": "Asia/Jerusalem", 952 "rules": [ 953 { 954 "e": 1223161200000, 955 "s": 1206662400000 956 }, 957 { 958 "e": 1254006000000, 959 "s": 1238112000000 960 }, 961 { 962 "e": 1284246000000, 963 "s": 1269561600000 964 }, 965 { 966 "e": 1317510000000, 967 "s": 1301616000000 968 }, 969 { 970 "e": 1348354800000, 971 "s": 1333065600000 972 }, 973 { 974 "e": 1382828400000, 975 "s": 1364515200000 976 }, 977 { 978 "e": 1414278000000, 979 "s": 1395964800000 980 } 981 ] 982 }, 983 { 984 "name": "Asia/Kamchatka", 985 "rules": [ 986 { 987 "e": 1224943200000, 988 "s": 1206799200000 989 }, 990 { 991 "e": 1256392800000, 992 "s": 1238248800000 993 }, 994 { 995 "e": 1288450800000, 996 "s": 1269698400000 997 }, 998 false, 999 false, 1000 false, 1001 false 1002 ] 1003 }, 1004 { 1005 "name": "Asia/Krasnoyarsk", 1006 "rules": [ 1007 { 1008 "e": 1224961200000, 1009 "s": 1206817200000 1010 }, 1011 { 1012 "e": 1256410800000, 1013 "s": 1238266800000 1014 }, 1015 { 1016 "e": 1288465200000, 1017 "s": 1269716400000 1018 }, 1019 false, 1020 false, 1021 false, 1022 false 1023 ] 1024 }, 1025 { 1026 "name": "Asia/Omsk", 1027 "rules": [ 1028 { 1029 "e": 1224964800000, 1030 "s": 1206820800000 1031 }, 1032 { 1033 "e": 1256414400000, 1034 "s": 1238270400000 1035 }, 1036 { 1037 "e": 1288468800000, 1038 "s": 1269720000000 1039 }, 1040 false, 1041 false, 1042 false, 1043 false 1044 ] 1045 }, 1046 { 1047 "name": "Asia/Vladivostok", 1048 "rules": [ 1049 { 1050 "e": 1224950400000, 1051 "s": 1206806400000 1052 }, 1053 { 1054 "e": 1256400000000, 1055 "s": 1238256000000 1056 }, 1057 { 1058 "e": 1288454400000, 1059 "s": 1269705600000 1060 }, 1061 false, 1062 false, 1063 false, 1064 false 1065 ] 1066 }, 1067 { 1068 "name": "Asia/Yakutsk", 1069 "rules": [ 1070 { 1071 "e": 1224954000000, 1072 "s": 1206810000000 1073 }, 1074 { 1075 "e": 1256403600000, 1076 "s": 1238259600000 1077 }, 1078 { 1079 "e": 1288458000000, 1080 "s": 1269709200000 1081 }, 1082 false, 1083 false, 1084 false, 1085 false 1086 ] 1087 }, 1088 { 1089 "name": "Asia/Yekaterinburg", 1090 "rules": [ 1091 { 1092 "e": 1224968400000, 1093 "s": 1206824400000 1094 }, 1095 { 1096 "e": 1256418000000, 1097 "s": 1238274000000 1098 }, 1099 { 1100 "e": 1288472400000, 1101 "s": 1269723600000 1102 }, 1103 false, 1104 false, 1105 false, 1106 false 1107 ] 1108 }, 1109 { 1110 "name": "Asia/Yerevan", 1111 "rules": [ 1112 { 1113 "e": 1224972000000, 1114 "s": 1206828000000 1115 }, 1116 { 1117 "e": 1256421600000, 1118 "s": 1238277600000 1119 }, 1120 { 1121 "e": 1288476000000, 1122 "s": 1269727200000 1123 }, 1124 { 1125 "e": 1319925600000, 1126 "s": 1301176800000 1127 }, 1128 false, 1129 false, 1130 false 1131 ] 1132 }, 1133 { 1134 "name": "Australia/Lord_Howe", 1135 "rules": [ 1136 { 1137 "e": 1207407600000, 1138 "s": 1223134200000 1139 }, 1140 { 1141 "e": 1238857200000, 1142 "s": 1254583800000 1143 }, 1144 { 1145 "e": 1270306800000, 1146 "s": 1286033400000 1147 }, 1148 { 1149 "e": 1301756400000, 1150 "s": 1317483000000 1151 }, 1152 { 1153 "e": 1333206000000, 1154 "s": 1349537400000 1155 }, 1156 { 1157 "e": 1365260400000, 1158 "s": 1380987000000 1159 }, 1160 { 1161 "e": 1396710000000, 1162 "s": 1412436600000 1163 } 1164 ] 1165 }, 1166 { 1167 "name": "Australia/Perth", 1168 "rules": [ 1169 { 1170 "e": 1206813600000, 1171 "s": 1224957600000 1172 }, 1173 false, 1174 false, 1175 false, 1176 false, 1177 false, 1178 false 1179 ] 1180 }, 1181 { 1182 "name": "Europe/Helsinki", 1183 "rules": [ 1184 { 1185 "e": 1224982800000, 1186 "s": 1206838800000 1187 }, 1188 { 1189 "e": 1256432400000, 1190 "s": 1238288400000 1191 }, 1192 { 1193 "e": 1288486800000, 1194 "s": 1269738000000 1195 }, 1196 { 1197 "e": 1319936400000, 1198 "s": 1301187600000 1199 }, 1200 { 1201 "e": 1351386000000, 1202 "s": 1332637200000 1203 }, 1204 { 1205 "e": 1382835600000, 1206 "s": 1364691600000 1207 }, 1208 { 1209 "e": 1414285200000, 1210 "s": 1396141200000 1211 } 1212 ] 1213 }, 1214 { 1215 "name": "Europe/Minsk", 1216 "rules": [ 1217 { 1218 "e": 1224979200000, 1219 "s": 1206835200000 1220 }, 1221 { 1222 "e": 1256428800000, 1223 "s": 1238284800000 1224 }, 1225 { 1226 "e": 1288483200000, 1227 "s": 1269734400000 1228 }, 1229 false, 1230 false, 1231 false, 1232 false 1233 ] 1234 }, 1235 { 1236 "name": "Europe/Moscow", 1237 "rules": [ 1238 { 1239 "e": 1224975600000, 1240 "s": 1206831600000 1241 }, 1242 { 1243 "e": 1256425200000, 1244 "s": 1238281200000 1245 }, 1246 { 1247 "e": 1288479600000, 1248 "s": 1269730800000 1249 }, 1250 false, 1251 false, 1252 false, 1253 false 1254 ] 1255 }, 1256 { 1257 "name": "Pacific/Apia", 1258 "rules": [ 1259 false, 1260 false, 1261 false, 1262 { 1263 "e": 1301752800000, 1264 "s": 1316872800000 1265 }, 1266 { 1267 "e": 1333202400000, 1268 "s": 1348927200000 1269 }, 1270 { 1271 "e": 1365256800000, 1272 "s": 1380376800000 1273 }, 1274 { 1275 "e": 1396706400000, 1276 "s": 1411826400000 1277 } 1278 ] 1279 }, 1280 { 1281 "name": "Pacific/Fiji", 1282 "rules": [ 1283 false, 1284 false, 1285 { 1286 "e": 1269698400000, 1287 "s": 1287842400000 1288 }, 1289 { 1290 "e": 1327154400000, 1291 "s": 1319292000000 1292 }, 1293 { 1294 "e": 1358604000000, 1295 "s": 1350741600000 1296 }, 1297 { 1298 "e": 1390050000000, 1299 "s": 1382796000000 1300 }, 1301 { 1302 "e": 1421503200000, 1303 "s": 1414850400000 1304 } 1305 ] 1306 } 1307 ] 1308}; if (typeof exports !== 'undefined') { 1309 exports.jstz = jstz; 1310 } else { 1311 root.jstz = jstz; 1312 } 1313})(this); 1314