jsTimezoneDetect-rails 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3780cb3cd9ac5b60753a001c6814fea32e4cd11a
4
+ data.tar.gz: 4728060dad04731b9d4e2ddda6ef93bbda9b3b70
5
+ SHA512:
6
+ metadata.gz: 65b5d338105e4f27d9bcc3ed971bd008eec28b02b99b02d224d5c6e32aab1bf14501e1faf1a8185e6aed043daa360675a0782e46097262b0b3be4c83df61284f
7
+ data.tar.gz: 59eab9327e913604ba95f9380e5bbb350a41dd641ef49f67ae6a60defcc2697aa65e5a51c2b30ff8a7c91df54a4a09ebae4d80deb31e5f6eee61f1a71b753a21
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Alexander Popov
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
13
+ all 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
21
+ THE SOFTWARE.
@@ -0,0 +1,36 @@
1
+ # jsTimezoneDetect-rails
2
+
3
+ This is a wrapper for the [jsTimezoneDetect.js](https://bitbucket.org/pellepim/jstimezonedetect) library, which makes it ready for use with the asset pipeline, provided by Rails 4.0 and higher. The gem includes the non-minified version of the library.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'jsTimezoneDetect-rails'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Add the following directive to your Javascript manifest file (application.js):
18
+
19
+ //= require jstz
20
+
21
+ ## Usage
22
+
23
+ Invoke the script by calling
24
+
25
+ ```javascript
26
+ var tz = jstz.determine(); // Determines the time zone of the browser client
27
+ tz.name(); // Returns the name of the time zone eg "Europe/Berlin"
28
+ ```
29
+
30
+ ## Contributing
31
+
32
+ 1. Fork it ( https://github.com/[my-github-username]/jsTimezoneDetect-rails/fork )
33
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
34
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
35
+ 4. Push to the branch (`git push origin my-new-feature`)
36
+ 5. Create a new Pull Request
@@ -0,0 +1,8 @@
1
+ require "jsTimezoneDetect/rails/version"
2
+
3
+ module JsTimezoneDetect
4
+ module Rails
5
+ class Engine < ::Rails::Engine
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ module JsTimezoneDetect
2
+ module Rails
3
+ VERSION = "1.0.5"
4
+ end
5
+ end
@@ -0,0 +1,1313 @@
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
+ */
20
+ var 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
+
400
+ jstz.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
+ */
416
+ jstz.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 */
492
+ jstz.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);