jsTimezoneDetect-rails 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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);