From 69685f36c4e4fb8eb468bbf463c085d8d8e2802a Mon Sep 17 00:00:00 2001 From: merencia Date: Thu, 15 Mar 2018 18:43:30 -0300 Subject: [PATCH] performing tasks on relative time at timezone --- src/node-cron.js | 4 +- src/task.js | 7 +- src/timezone/timezone-converter.js | 26 + src/timezone/timezones.js | 20 + .../step-values-conversion-test.js | 1 - test/timezone/task-with-timezone-test.js | 51 ++ test/timezone/timezone-converter-test.js | 34 + timezones.json | 600 +++++++++++++++++- 8 files changed, 738 insertions(+), 5 deletions(-) create mode 100644 src/timezone/timezone-converter.js create mode 100644 src/timezone/timezones.js create mode 100644 test/timezone/task-with-timezone-test.js create mode 100644 test/timezone/timezone-converter-test.js diff --git a/src/node-cron.js b/src/node-cron.js index 8e5074e..3bb2e83 100644 --- a/src/node-cron.js +++ b/src/node-cron.js @@ -14,8 +14,8 @@ module.exports = (function() { * @param {boolean} immediateStart - whether to start the task immediately. * @returns {ScheduledTask} update function. */ - function createTask(expression, func, immediateStart) { - var task = new Task(expression, func); + function createTask(expression, func, immediateStart, timezone) { + var task = new Task(expression, func, timezone); return new ScheduledTask(task, immediateStart); } diff --git a/src/task.js b/src/task.js index 2d54e37..5073c47 100644 --- a/src/task.js +++ b/src/task.js @@ -2,6 +2,7 @@ var convertExpression = require('./convert-expression'); var validatePattern = require('./pattern-validation'); +var tz = require('./timezone/timezone-converter'); module.exports = (function(){ function matchPattern(pattern, value){ @@ -13,6 +14,9 @@ module.exports = (function(){ } function mustRun(task, date){ + if(task.timezone) + date = tz.atTimezone(date, task.timezone); + var runInSecond = matchPattern(task.expressions[0], date.getSeconds()); var runOnMinute = matchPattern(task.expressions[1], date.getMinutes()); var runOnHour = matchPattern(task.expressions[2], date.getHours()); @@ -34,8 +38,9 @@ module.exports = (function(){ return runInSecond && runOnMinute && runOnHour && runOnDay && runOnMonth; } - function Task(pattern, execution){ + function Task(pattern, execution, timezone){ validatePattern(pattern); + this.timezone = timezone; this.initialPattern = pattern.split(' '); this.pattern = convertExpression(pattern); this.execution = execution; diff --git a/src/timezone/timezone-converter.js b/src/timezone/timezone-converter.js new file mode 100644 index 0000000..f84afcb --- /dev/null +++ b/src/timezone/timezone-converter.js @@ -0,0 +1,26 @@ +'use strict'; +var tz = require('./timezones'); + +module.exports = (function(){ + /** + * + */ + + function getUTCTime(date){ + var currentOffset = date.getTimezoneOffset() * 60000; + if(currentOffset > 0) { + return date.getTime() + currentOffset; + } + return date.getTime() - currentOffset; + } + + function atTimezone(date, timezoneName){ + var utcTime = getUTCTime(date); + var time = utcTime + tz.getOffset(timezoneName); + return new Date(time); + } + + return { + atTimezone: atTimezone + } +})(); \ No newline at end of file diff --git a/src/timezone/timezones.js b/src/timezone/timezones.js new file mode 100644 index 0000000..f68568e --- /dev/null +++ b/src/timezone/timezones.js @@ -0,0 +1,20 @@ +'use strict'; +var timezones = require('../../timezones'); + +module.exports = (function(){ + + var tz = {}; + + for(var key in timezones){ + var value = timezones[key]; + tz[key.toLowerCase()] = value; + } + + function getOffset(tzName){ + return tz[tzName.toLowerCase()] / 100 * 60 * 60000; + } + + return { + getOffset: getOffset + } +})(); \ No newline at end of file diff --git a/test/convert-expression/step-values-conversion-test.js b/test/convert-expression/step-values-conversion-test.js index e2eba9a..c412472 100644 --- a/test/convert-expression/step-values-conversion-test.js +++ b/test/convert-expression/step-values-conversion-test.js @@ -7,7 +7,6 @@ describe('step-values-conversion.js', function() { it('shuld convert step values', function() { var expressions = '1,2,3,4,5,6,7,8,9,10/2 0,1,2,3,4,5,6,7,8,9/5 * * * *'.split(' '); expressions = conversion(expressions); - console.log(expressions); expect(expressions[0]).to.equal('2,4,6,8,10'); expect(expressions[1]).to.equal('0,5'); }); diff --git a/test/timezone/task-with-timezone-test.js b/test/timezone/task-with-timezone-test.js new file mode 100644 index 0000000..60e3fea --- /dev/null +++ b/test/timezone/task-with-timezone-test.js @@ -0,0 +1,51 @@ +'use strict'; + +var expect = require('expect.js'); +var sinon = require('sinon'); +var Task = require('../../src/task'); +var cron = require('../../src/node-cron'); +var tz = require('../../src/timezone/timezone-converter') + +describe('task at timezone', function () { + it('should should perform at timezone', function () { + var task = new Task('* 4 * * *', function () { + this.executed += 1; + }, "America/Virgin"); + task.executed = 0; + var date = new Date('August 19, 2018 00:00:00 GMT-03:00'); + date.setHours(date.getHours() + 1); + task.update(date); + date.setHours(date.getHours() + 3); + task.update(date); + date.setHours(date.getHours() + 1); + task.update(date); + expect(1).to.equal(task.executed); + }); + + describe('by node-cron', function () { + beforeEach(function () { + this.now = new Date('August 19, 2018 03:00:00 GMT-04:00'); + this.clock = sinon.useFakeTimers(this.now); + }); + + afterEach(function () { + this.clock.restore(); + }); + + it('should perform at timezone', function () { + var executed = 0; + var executedAt = null; + var executedAt2 = null; + var task = cron.schedule('* 4 * * *', function () { + executed++; + executedAt = new Date(); + }, true, "America/Virgin"); + + this.clock.tick(60 * 60 * 1000); + this.now.setHours(this.now.getHours() + 1); + + expect(executedAt.getHours()).to.equal(this.now.getHours()); + }); + + }); +}); diff --git a/test/timezone/timezone-converter-test.js b/test/timezone/timezone-converter-test.js new file mode 100644 index 0000000..0a00055 --- /dev/null +++ b/test/timezone/timezone-converter-test.js @@ -0,0 +1,34 @@ +'use strict'; + +var expect = require('expect.js'); +var timezone = require('../../src/timezone/timezone-converter'); + +describe('convert timezone', function() { + + it('should convert a date to greenwich timezone', function() { + var date = new Date('August 19, 2018 23:00:00 GMT-03:00'); + var relativeDate = timezone.atTimezone(date, "Greenwich"); + expect(relativeDate.getDate()).to.equal(20); + expect(relativeDate.getHours()).to.equal(2); + }); + + it('should convert a date to greenwich timezone', function() { + var date = new Date('August 19, 2018 00:00:00 GMT-03:00'); + var relativeDate = timezone.atTimezone(date, "Greenwich"); + expect(relativeDate.getDate()).to.equal(19); + expect(relativeDate.getHours()).to.equal(3); + }); + + it('should convert a date to Sydney timezone', function() { + var date = new Date('August 19, 2018 14:00:00 GMT+11:00'); + var relativeDate = timezone.atTimezone(date, "Greenwich"); + expect(relativeDate.getHours()).to.equal(3); + }); + + + it('should convert a date to America/Virgin timezone', function() { + var date = new Date('August 19, 2018 10:00:00 GMT-03:00'); + var relativeDate = timezone.atTimezone(date, "America/Virgin") + expect(relativeDate.getHours()).to.equal(9); + }); +}); diff --git a/timezones.json b/timezones.json index ae7ef0f..c912d92 100644 --- a/timezones.json +++ b/timezones.json @@ -1 +1,599 @@ -{"Africa/Abidjan": 0,"Africa/Accra": 0,"Africa/Addis_Ababa": 300,"Africa/Algiers": 100,"Africa/Asmara": 300,"Africa/Asmera": 300,"Africa/Bamako": 0,"Africa/Bangui": 100,"Africa/Banjul": 0,"Africa/Bissau": 0,"Africa/Blantyre": 200,"Africa/Brazzaville": 100,"Africa/Bujumbura": 200,"Africa/Cairo": 200,"Africa/Casablanca": 0,"Africa/Ceuta": 100,"Africa/Conakry": 0,"Africa/Dakar": 0,"Africa/Dar_es_Salaam": 300,"Africa/Djibouti": 300,"Africa/Douala": 100,"Africa/El_Aaiun": 0,"Africa/Freetown": 0,"Africa/Gaborone": 200,"Africa/Harare": 200,"Africa/Johannesburg": 200,"Africa/Juba": 300,"Africa/Kampala": 300,"Africa/Khartoum": 300,"Africa/Kigali": 200,"Africa/Kinshasa": 100,"Africa/Lagos": 100,"Africa/Libreville": 100,"Africa/Lome": 0,"Africa/Luanda": 100,"Africa/Lubumbashi": 200,"Africa/Lusaka": 200,"Africa/Malabo": 100,"Africa/Maputo": 200,"Africa/Maseru": 200,"Africa/Mbabane": 200,"Africa/Mogadishu": 300,"Africa/Monrovia": 0,"Africa/Nairobi": 300,"Africa/Ndjamena": 100,"Africa/Niamey": 100,"Africa/Nouakchott": 0,"Africa/Ouagadougou": 0,"Africa/Porto-Novo": 100,"Africa/Sao_Tome": 0,"Africa/Timbuktu": 0,"Africa/Tripoli": 200,"Africa/Tunis": 100,"Africa/Windhoek": 200,"America/Adak": -900,"America/Anchorage": -800,"America/Anguilla": -400,"America/Antigua": -400,"America/Araguaina": -300,"America/Argentina/Buenos_Aires": -300,"America/Argentina/Catamarca": -300,"America/Argentina/ComodRivadavia": -300,"America/Argentina/Cordoba": -300,"America/Argentina/Jujuy": -300,"America/Argentina/La_Rioja": -300,"America/Argentina/Mendoza": -300,"America/Argentina/Rio_Gallegos": -300,"America/Argentina/Salta": -300,"America/Argentina/San_Juan": -300,"America/Argentina/San_Luis": -300,"America/Argentina/Tucuman": -300,"America/Argentina/Ushuaia": -300,"America/Aruba": -400,"America/Asuncion": -300,"America/Atikokan": -500,"America/Atka": -900,"America/Bahia": -300,"America/Bahia_Banderas": -600,"America/Barbados": -400,"America/Belem": -300,"America/Belize": -600,"America/Blanc-Sablon": -400,"America/Boa_Vista": -400,"America/Bogota": -500,"America/Boise": -600,"America/Buenos_Aires": -300,"America/Cambridge_Bay": -600,"America/Campo_Grande": -400,"America/Cancun": -500,"America/Caracas": -400,"America/Catamarca": -300,"America/Cayenne": -300,"America/Cayman": -500,"America/Chicago": -500,"America/Chihuahua": -700,"America/Coral_Harbour": -500,"America/Cordoba": -300,"America/Costa_Rica": -600,"America/Creston": -700,"America/Cuiaba": -400,"America/Curacao": -400,"America/Danmarkshavn": 0,"America/Dawson": -700,"America/Dawson_Creek": -700,"America/Denver": -600,"America/Detroit": -400,"America/Dominica": -400,"America/Edmonton": -600,"America/Eirunepe": -500,"America/El_Salvador": -600,"America/Ensenada": -700,"America/Fort_Nelson": -700,"America/Fort_Wayne": -400,"America/Fortaleza": -300,"America/Glace_Bay": -300,"America/Godthab": -300,"America/Goose_Bay": -300,"America/Grand_Turk": -400,"America/Grenada": -400,"America/Guadeloupe": -400,"America/Guatemala": -600,"America/Guayaquil": -500,"America/Guyana": -400,"America/Halifax": -300,"America/Havana": -400,"America/Hermosillo": -700,"America/Indiana/Indianapolis": -400,"America/Indiana/Knox": -500,"America/Indiana/Marengo": -400,"America/Indiana/Petersburg": -400,"America/Indiana/Tell_City": -500,"America/Indiana/Vevay": -400,"America/Indiana/Vincennes": -400,"America/Indiana/Winamac": -400,"America/Indianapolis": -400,"America/Inuvik": -600,"America/Iqaluit": -400,"America/Jamaica": -500,"America/Jujuy": -300,"America/Juneau": -800,"America/Kentucky/Louisville": -400,"America/Kentucky/Monticello": -400,"America/Knox_IN": -500,"America/Kralendijk": -400,"America/La_Paz": -400,"America/Lima": -500,"America/Los_Angeles": -700,"America/Louisville": -400,"America/Lower_Princes": -400,"America/Maceio": -300,"America/Managua": -600,"America/Manaus": -400,"America/Marigot": -400,"America/Martinique": -400,"America/Matamoros": -500,"America/Mazatlan": -700,"America/Mendoza": -300,"America/Menominee": -500,"America/Merida": -600,"America/Metlakatla": -800,"America/Mexico_City": -600,"America/Miquelon": -200,"America/Moncton": -300,"America/Monterrey": -600,"America/Montevideo": -300,"America/Montreal": -400,"America/Montserrat": -400,"America/Nassau": -400,"America/New_York": -400,"America/Nipigon": -400,"America/Nome": -800,"America/Noronha": -200,"America/North_Dakota/Beulah": -500,"America/North_Dakota/Center": -500,"America/North_Dakota/New_Salem": -500,"America/Ojinaga": -600,"America/Panama": -500,"America/Pangnirtung": -400,"America/Paramaribo": -300,"America/Phoenix": -700,"America/Port-au-Prince": -400,"America/Port_of_Spain": -400,"America/Porto_Acre": -500,"America/Porto_Velho": -400,"America/Puerto_Rico": -400,"America/Punta_Arenas": -300,"America/Rainy_River": -500,"America/Rankin_Inlet": -500,"America/Recife": -300,"America/Regina": -600,"America/Resolute": -500,"America/Rio_Branco": -500,"America/Rosario": -300,"America/Santa_Isabel": -700,"America/Santarem": -300,"America/Santiago": -300,"America/Santo_Domingo": -400,"America/Sao_Paulo": -300,"America/Scoresbysund": -100,"America/Shiprock": -600,"America/Sitka": -800,"America/St_Barthelemy": -400,"America/St_Johns": -230,"America/St_Kitts": -400,"America/St_Lucia": -400,"America/St_Thomas": -400,"America/St_Vincent": -400,"America/Swift_Current": -600,"America/Tegucigalpa": -600,"America/Thule": -300,"America/Thunder_Bay": -400,"America/Tijuana": -700,"America/Toronto": -400,"America/Tortola": -400,"America/Vancouver": -700,"America/Virgin": -400,"America/Whitehorse": -700,"America/Winnipeg": -500,"America/Yakutat": -800,"America/Yellowknife": -600,"Antarctica/Casey": 1100,"Antarctica/Davis": 700,"Antarctica/DumontDUrville": 1000,"Antarctica/Macquarie": 1100,"Antarctica/Mawson": 500,"Antarctica/McMurdo": 1300,"Antarctica/Palmer": -300,"Antarctica/Rothera": -300,"Antarctica/South_Pole": 1300,"Antarctica/Syowa": 300,"Antarctica/Troll": 0,"Antarctica/Vostok": 600,"Arctic/Longyearbyen": 100,"Asia/Aden": 300,"Asia/Almaty": 600,"Asia/Amman": 200,"Asia/Anadyr": 1200,"Asia/Aqtau": 500,"Asia/Aqtobe": 500,"Asia/Ashgabat": 500,"Asia/Ashkhabad": 500,"Asia/Atyrau": 500,"Asia/Baghdad": 300,"Asia/Bahrain": 300,"Asia/Baku": 400,"Asia/Bangkok": 700,"Asia/Barnaul": 700,"Asia/Beirut": 200,"Asia/Bishkek": 600,"Asia/Brunei": 800,"Asia/Calcutta": 530,"Asia/Chita": 900,"Asia/Choibalsan": 800,"Asia/Chongqing": 800,"Asia/Chungking": 800,"Asia/Colombo": 530,"Asia/Dacca": 600,"Asia/Damascus": 200,"Asia/Dhaka": 600,"Asia/Dili": 900,"Asia/Dubai": 400,"Asia/Dushanbe": 500,"Asia/Famagusta": 300,"Asia/Gaza": 200,"Asia/Harbin": 800,"Asia/Hebron": 200,"Asia/Ho_Chi_Minh": 700,"Asia/Hong_Kong": 800,"Asia/Hovd": 700,"Asia/Irkutsk": 800,"Asia/Istanbul": 300,"Asia/Jakarta": 700,"Asia/Jayapura": 900,"Asia/Jerusalem": 200,"Asia/Kabul": 430,"Asia/Kamchatka": 1200,"Asia/Karachi": 500,"Asia/Kashgar": 600,"Asia/Kathmandu": 545,"Asia/Katmandu": 545,"Asia/Khandyga": 900,"Asia/Kolkata": 530,"Asia/Krasnoyarsk": 700,"Asia/Kuala_Lumpur": 800,"Asia/Kuching": 800,"Asia/Kuwait": 300,"Asia/Macao": 800,"Asia/Macau": 800,"Asia/Magadan": 1100,"Asia/Makassar": 800,"Asia/Manila": 800,"Asia/Muscat": 400,"Asia/Nicosia": 200,"Asia/Novokuznetsk": 700,"Asia/Novosibirsk": 700,"Asia/Omsk": 600,"Asia/Oral": 500,"Asia/Phnom_Penh": 700,"Asia/Pontianak": 700,"Asia/Pyongyang": 830,"Asia/Qatar": 300,"Asia/Qyzylorda": 600,"Asia/Rangoon": 630,"Asia/Riyadh": 300,"Asia/Saigon": 700,"Asia/Sakhalin": 1100,"Asia/Samarkand": 500,"Asia/Seoul": 900,"Asia/Shanghai": 800,"Asia/Singapore": 800,"Asia/Srednekolymsk": 1100,"Asia/Taipei": 800,"Asia/Tashkent": 500,"Asia/Tbilisi": 400,"Asia/Tehran": 330,"Asia/Tel_Aviv": 200,"Asia/Thimbu": 600,"Asia/Thimphu": 600,"Asia/Tokyo": 900,"Asia/Tomsk": 700,"Asia/Ujung_Pandang": 800,"Asia/Ulaanbaatar": 800,"Asia/Ulan_Bator": 800,"Asia/Urumqi": 600,"Asia/Ust-Nera": 1000,"Asia/Vientiane": 700,"Asia/Vladivostok": 1000,"Asia/Yakutsk": 900,"Asia/Yangon": 630,"Asia/Yekaterinburg": 500,"Asia/Yerevan": 400,"Atlantic/Azores": -100,"Atlantic/Bermuda": -300,"Atlantic/Canary": 0,"Atlantic/Cape_Verde": -100,"Atlantic/Faeroe": 0,"Atlantic/Faroe": 0,"Atlantic/Jan_Mayen": 100,"Atlantic/Madeira": 0,"Atlantic/Reykjavik": 0,"Atlantic/South_Georgia": -200,"Atlantic/St_Helena": 0,"Atlantic/Stanley": -300,"Australia/ACT": 1100,"Australia/Adelaide": 1030,"Australia/Brisbane": 1000,"Australia/Broken_Hill": 1030,"Australia/Canberra": 1100,"Australia/Currie": 1100,"Australia/Darwin": 930,"Australia/Eucla": 845,"Australia/Hobart": 1100,"Australia/LHI": 1100,"Australia/Lindeman": 1000,"Australia/Lord_Howe": 1100,"Australia/Melbourne": 1100,"Australia/NSW": 1100,"Australia/North": 930,"Australia/Perth": 800,"Australia/Queensland": 1000,"Australia/South": 1030,"Australia/Sydney": 1100,"Australia/Tasmania": 1100,"Australia/Victoria": 1100,"Australia/West": 800,"Australia/Yancowinna": 1030,"Brazil/Acre": -500,"Brazil/DeNoronha": -200,"Brazil/East": -300,"Brazil/West": -400,"CET": 100,"CST6CDT": -500,"Canada/Atlantic": -300,"Canada/Central": -500,"Canada/East-Saskatchewan": -600,"Canada/Eastern": -400,"Canada/Mountain": -600,"Canada/Newfoundland": -230,"Canada/Pacific": -700,"Canada/Saskatchewan": -600,"Canada/Yukon": -700,"Chile/Continental": -300,"Chile/EasterIsland": -500,"Cuba": -400,"EET": 200,"EST": -500,"EST5EDT": -400,"Egypt": 200,"Eire": 0,"Etc/GMT": 0,"Etc/GMT+0": 0,"Etc/GMT+1": -100,"Etc/GMT+10": -1000,"Etc/GMT+11": -1100,"Etc/GMT+12": -1200,"Etc/GMT+2": -200,"Etc/GMT+3": -300,"Etc/GMT+4": -400,"Etc/GMT+5": -500,"Etc/GMT+6": -600,"Etc/GMT+7": -700,"Etc/GMT+8": -800,"Etc/GMT+9": -900,"Etc/GMT-0": 0,"Etc/GMT-1": 100,"Etc/GMT-10": 1000,"Etc/GMT-11": 1100,"Etc/GMT-12": 1200,"Etc/GMT-13": 1300,"Etc/GMT-14": 1400,"Etc/GMT-2": 200,"Etc/GMT-3": 300,"Etc/GMT-4": 400,"Etc/GMT-5": 500,"Etc/GMT-6": 600,"Etc/GMT-7": 700,"Etc/GMT-8": 800,"Etc/GMT-9": 900,"Etc/GMT0": 0,"Etc/Greenwich": 0,"Etc/UCT": 0,"Etc/UTC": 0,"Etc/Universal": 0,"Etc/Zulu": 0,"Europe/Amsterdam": 100,"Europe/Andorra": 100,"Europe/Astrakhan": 400,"Europe/Athens": 200,"Europe/Belfast": 0,"Europe/Belgrade": 100,"Europe/Berlin": 100,"Europe/Bratislava": 100,"Europe/Brussels": 100,"Europe/Bucharest": 200,"Europe/Budapest": 100,"Europe/Busingen": 100,"Europe/Chisinau": 200,"Europe/Copenhagen": 100,"Europe/Dublin": 0,"Europe/Gibraltar": 100,"Europe/Guernsey": 0,"Europe/Helsinki": 200,"Europe/Isle_of_Man": 0,"Europe/Istanbul": 300,"Europe/Jersey": 0,"Europe/Kaliningrad": 200,"Europe/Kiev": 200,"Europe/Kirov": 300,"Europe/Lisbon": 0,"Europe/Ljubljana": 100,"Europe/London": 0,"Europe/Luxembourg": 100,"Europe/Madrid": 100,"Europe/Malta": 100,"Europe/Mariehamn": 200,"Europe/Minsk": 300,"Europe/Monaco": 100,"Europe/Moscow": 300,"Europe/Nicosia": 200,"Europe/Oslo": 100,"Europe/Paris": 100,"Europe/Podgorica": 100,"Europe/Prague": 100,"Europe/Riga": 200,"Europe/Rome": 100,"Europe/Samara": 400,"Europe/San_Marino": 100,"Europe/Sarajevo": 100,"Europe/Saratov": 400,"Europe/Simferopol": 300,"Europe/Skopje": 100,"Europe/Sofia": 200,"Europe/Stockholm": 100,"Europe/Tallinn": 200,"Europe/Tirane": 100,"Europe/Tiraspol": 200,"Europe/Ulyanovsk": 400,"Europe/Uzhgorod": 200,"Europe/Vaduz": 100,"Europe/Vatican": 100,"Europe/Vienna": 100,"Europe/Vilnius": 200,"Europe/Volgograd": 300,"Europe/Warsaw": 100,"Europe/Zagreb": 100,"Europe/Zaporozhye": 200,"Europe/Zurich": 100,"Factory": 0,"GB": 0,"GB-Eire": 0,"GMT": 0,"GMT+0": 0,"GMT-0": 0,"GMT0": 0,"Greenwich": 0,"HST": -1000,"Hongkong": 800,"Iceland": 0,"Indian/Antananarivo": 300,"Indian/Chagos": 600,"Indian/Christmas": 700,"Indian/Cocos": 630,"Indian/Comoro": 300,"Indian/Kerguelen": 500,"Indian/Mahe": 400,"Indian/Maldives": 500,"Indian/Mauritius": 400,"Indian/Mayotte": 300,"Indian/Reunion": 400,"Iran": 330,"Israel": 200,"Jamaica": -500,"Japan": 900,"Kwajalein": 1200,"Libya": 200,"MET": 100,"MST": -700,"MST7MDT": -600,"Mexico/BajaNorte": -700,"Mexico/BajaSur": -700,"Mexico/General": -600,"NZ": 1300,"NZ-CHAT": 1345,"Navajo": -600,"PRC": 800,"PST8PDT": -700,"Pacific/Apia": 1400,"Pacific/Auckland": 1300,"Pacific/Bougainville": 1100,"Pacific/Chatham": 1345,"Pacific/Chuuk": 1000,"Pacific/Easter": -500,"Pacific/Efate": 1100,"Pacific/Enderbury": 1300,"Pacific/Fakaofo": 1300,"Pacific/Fiji": 1200,"Pacific/Funafuti": 1200,"Pacific/Galapagos": -600,"Pacific/Gambier": -900,"Pacific/Guadalcanal": 1100,"Pacific/Guam": 1000,"Pacific/Honolulu": -1000,"Pacific/Johnston": -1000,"Pacific/Kiritimati": 1400,"Pacific/Kosrae": 1100,"Pacific/Kwajalein": 1200,"Pacific/Majuro": 1200,"Pacific/Marquesas": -930,"Pacific/Midway": -1100,"Pacific/Nauru": 1200,"Pacific/Niue": -1100,"Pacific/Norfolk": 1100,"Pacific/Noumea": 1100,"Pacific/Pago_Pago": -1100,"Pacific/Palau": 900,"Pacific/Pitcairn": -800,"Pacific/Pohnpei": 1100,"Pacific/Ponape": 1100,"Pacific/Port_Moresby": 1000,"Pacific/Rarotonga": -1000,"Pacific/Saipan": 1000,"Pacific/Samoa": -1100,"Pacific/Tahiti": -1000,"Pacific/Tarawa": 1200,"Pacific/Tongatapu": 1300,"Pacific/Truk": 1000,"Pacific/Wake": 1200,"Pacific/Wallis": 1200,"Pacific/Yap": 1000,"Poland": 100,"Portugal": 0,"ROC": 800,"ROK": 900,"Singapore": 800,"Turkey": 300,"UCT": 0,"US/Alaska": -800,"US/Aleutian": -900,"US/Arizona": -700,"US/Central": -500,"US/East-Indiana": -400,"US/Eastern": -400,"US/Hawaii": -1000,"US/Indiana-Starke": -500,"US/Michigan": -400,"US/Mountain": -600,"US/Pacific": -700,"US/Pacific-New": -700,"US/Samoa": -1100,"UTC": 0,"Universal": 0,"W-SU": 300,"WET": 0,"Zulu": 0,"iso3166.tab": 0,"posixrules": -400,"zone.tab": 0} +{ + "Africa/Abidjan": 0, + "Africa/Accra": 0, + "Africa/Addis_Ababa": 300, + "Africa/Algiers": 100, + "Africa/Asmara": 300, + "Africa/Asmera": 300, + "Africa/Bamako": 0, + "Africa/Bangui": 100, + "Africa/Banjul": 0, + "Africa/Bissau": 0, + "Africa/Blantyre": 200, + "Africa/Brazzaville": 100, + "Africa/Bujumbura": 200, + "Africa/Cairo": 200, + "Africa/Casablanca": 0, + "Africa/Ceuta": 100, + "Africa/Conakry": 0, + "Africa/Dakar": 0, + "Africa/Dar_es_Salaam": 300, + "Africa/Djibouti": 300, + "Africa/Douala": 100, + "Africa/El_Aaiun": 0, + "Africa/Freetown": 0, + "Africa/Gaborone": 200, + "Africa/Harare": 200, + "Africa/Johannesburg": 200, + "Africa/Juba": 300, + "Africa/Kampala": 300, + "Africa/Khartoum": 300, + "Africa/Kigali": 200, + "Africa/Kinshasa": 100, + "Africa/Lagos": 100, + "Africa/Libreville": 100, + "Africa/Lome": 0, + "Africa/Luanda": 100, + "Africa/Lubumbashi": 200, + "Africa/Lusaka": 200, + "Africa/Malabo": 100, + "Africa/Maputo": 200, + "Africa/Maseru": 200, + "Africa/Mbabane": 200, + "Africa/Mogadishu": 300, + "Africa/Monrovia": 0, + "Africa/Nairobi": 300, + "Africa/Ndjamena": 100, + "Africa/Niamey": 100, + "Africa/Nouakchott": 0, + "Africa/Ouagadougou": 0, + "Africa/Porto-Novo": 100, + "Africa/Sao_Tome": 0, + "Africa/Timbuktu": 0, + "Africa/Tripoli": 200, + "Africa/Tunis": 100, + "Africa/Windhoek": 200, + "America/Adak": -900, + "America/Anchorage": -800, + "America/Anguilla": -400, + "America/Antigua": -400, + "America/Araguaina": -300, + "America/Argentina/Buenos_Aires": -300, + "America/Argentina/Catamarca": -300, + "America/Argentina/ComodRivadavia": -300, + "America/Argentina/Cordoba": -300, + "America/Argentina/Jujuy": -300, + "America/Argentina/La_Rioja": -300, + "America/Argentina/Mendoza": -300, + "America/Argentina/Rio_Gallegos": -300, + "America/Argentina/Salta": -300, + "America/Argentina/San_Juan": -300, + "America/Argentina/San_Luis": -300, + "America/Argentina/Tucuman": -300, + "America/Argentina/Ushuaia": -300, + "America/Aruba": -400, + "America/Asuncion": -300, + "America/Atikokan": -500, + "America/Atka": -900, + "America/Bahia": -300, + "America/Bahia_Banderas": -600, + "America/Barbados": -400, + "America/Belem": -300, + "America/Belize": -600, + "America/Blanc-Sablon": -400, + "America/Boa_Vista": -400, + "America/Bogota": -500, + "America/Boise": -600, + "America/Buenos_Aires": -300, + "America/Cambridge_Bay": -600, + "America/Campo_Grande": -400, + "America/Cancun": -500, + "America/Caracas": -400, + "America/Catamarca": -300, + "America/Cayenne": -300, + "America/Cayman": -500, + "America/Chicago": -500, + "America/Chihuahua": -700, + "America/Coral_Harbour": -500, + "America/Cordoba": -300, + "America/Costa_Rica": -600, + "America/Creston": -700, + "America/Cuiaba": -400, + "America/Curacao": -400, + "America/Danmarkshavn": 0, + "America/Dawson": -700, + "America/Dawson_Creek": -700, + "America/Denver": -600, + "America/Detroit": -400, + "America/Dominica": -400, + "America/Edmonton": -600, + "America/Eirunepe": -500, + "America/El_Salvador": -600, + "America/Ensenada": -700, + "America/Fort_Nelson": -700, + "America/Fort_Wayne": -400, + "America/Fortaleza": -300, + "America/Glace_Bay": -300, + "America/Godthab": -300, + "America/Goose_Bay": -300, + "America/Grand_Turk": -400, + "America/Grenada": -400, + "America/Guadeloupe": -400, + "America/Guatemala": -600, + "America/Guayaquil": -500, + "America/Guyana": -400, + "America/Halifax": -300, + "America/Havana": -400, + "America/Hermosillo": -700, + "America/Indiana/Indianapolis": -400, + "America/Indiana/Knox": -500, + "America/Indiana/Marengo": -400, + "America/Indiana/Petersburg": -400, + "America/Indiana/Tell_City": -500, + "America/Indiana/Vevay": -400, + "America/Indiana/Vincennes": -400, + "America/Indiana/Winamac": -400, + "America/Indianapolis": -400, + "America/Inuvik": -600, + "America/Iqaluit": -400, + "America/Jamaica": -500, + "America/Jujuy": -300, + "America/Juneau": -800, + "America/Kentucky/Louisville": -400, + "America/Kentucky/Monticello": -400, + "America/Knox_IN": -500, + "America/Kralendijk": -400, + "America/La_Paz": -400, + "America/Lima": -500, + "America/Los_Angeles": -700, + "America/Louisville": -400, + "America/Lower_Princes": -400, + "America/Maceio": -300, + "America/Managua": -600, + "America/Manaus": -400, + "America/Marigot": -400, + "America/Martinique": -400, + "America/Matamoros": -500, + "America/Mazatlan": -700, + "America/Mendoza": -300, + "America/Menominee": -500, + "America/Merida": -600, + "America/Metlakatla": -800, + "America/Mexico_City": -600, + "America/Miquelon": -200, + "America/Moncton": -300, + "America/Monterrey": -600, + "America/Montevideo": -300, + "America/Montreal": -400, + "America/Montserrat": -400, + "America/Nassau": -400, + "America/New_York": -400, + "America/Nipigon": -400, + "America/Nome": -800, + "America/Noronha": -200, + "America/North_Dakota/Beulah": -500, + "America/North_Dakota/Center": -500, + "America/North_Dakota/New_Salem": -500, + "America/Ojinaga": -600, + "America/Panama": -500, + "America/Pangnirtung": -400, + "America/Paramaribo": -300, + "America/Phoenix": -700, + "America/Port-au-Prince": -400, + "America/Port_of_Spain": -400, + "America/Porto_Acre": -500, + "America/Porto_Velho": -400, + "America/Puerto_Rico": -400, + "America/Punta_Arenas": -300, + "America/Rainy_River": -500, + "America/Rankin_Inlet": -500, + "America/Recife": -300, + "America/Regina": -600, + "America/Resolute": -500, + "America/Rio_Branco": -500, + "America/Rosario": -300, + "America/Santa_Isabel": -700, + "America/Santarem": -300, + "America/Santiago": -300, + "America/Santo_Domingo": -400, + "America/Sao_Paulo": -300, + "America/Scoresbysund": -100, + "America/Shiprock": -600, + "America/Sitka": -800, + "America/St_Barthelemy": -400, + "America/St_Johns": -230, + "America/St_Kitts": -400, + "America/St_Lucia": -400, + "America/St_Thomas": -400, + "America/St_Vincent": -400, + "America/Swift_Current": -600, + "America/Tegucigalpa": -600, + "America/Thule": -300, + "America/Thunder_Bay": -400, + "America/Tijuana": -700, + "America/Toronto": -400, + "America/Tortola": -400, + "America/Vancouver": -700, + "America/Virgin": -400, + "America/Whitehorse": -700, + "America/Winnipeg": -500, + "America/Yakutat": -800, + "America/Yellowknife": -600, + "Antarctica/Casey": 1100, + "Antarctica/Davis": 700, + "Antarctica/DumontDUrville": 1000, + "Antarctica/Macquarie": 1100, + "Antarctica/Mawson": 500, + "Antarctica/McMurdo": 1300, + "Antarctica/Palmer": -300, + "Antarctica/Rothera": -300, + "Antarctica/South_Pole": 1300, + "Antarctica/Syowa": 300, + "Antarctica/Troll": 0, + "Antarctica/Vostok": 600, + "Arctic/Longyearbyen": 100, + "Asia/Aden": 300, + "Asia/Almaty": 600, + "Asia/Amman": 200, + "Asia/Anadyr": 1200, + "Asia/Aqtau": 500, + "Asia/Aqtobe": 500, + "Asia/Ashgabat": 500, + "Asia/Ashkhabad": 500, + "Asia/Atyrau": 500, + "Asia/Baghdad": 300, + "Asia/Bahrain": 300, + "Asia/Baku": 400, + "Asia/Bangkok": 700, + "Asia/Barnaul": 700, + "Asia/Beirut": 200, + "Asia/Bishkek": 600, + "Asia/Brunei": 800, + "Asia/Calcutta": 530, + "Asia/Chita": 900, + "Asia/Choibalsan": 800, + "Asia/Chongqing": 800, + "Asia/Chungking": 800, + "Asia/Colombo": 530, + "Asia/Dacca": 600, + "Asia/Damascus": 200, + "Asia/Dhaka": 600, + "Asia/Dili": 900, + "Asia/Dubai": 400, + "Asia/Dushanbe": 500, + "Asia/Famagusta": 300, + "Asia/Gaza": 200, + "Asia/Harbin": 800, + "Asia/Hebron": 200, + "Asia/Ho_Chi_Minh": 700, + "Asia/Hong_Kong": 800, + "Asia/Hovd": 700, + "Asia/Irkutsk": 800, + "Asia/Istanbul": 300, + "Asia/Jakarta": 700, + "Asia/Jayapura": 900, + "Asia/Jerusalem": 200, + "Asia/Kabul": 430, + "Asia/Kamchatka": 1200, + "Asia/Karachi": 500, + "Asia/Kashgar": 600, + "Asia/Kathmandu": 545, + "Asia/Katmandu": 545, + "Asia/Khandyga": 900, + "Asia/Kolkata": 530, + "Asia/Krasnoyarsk": 700, + "Asia/Kuala_Lumpur": 800, + "Asia/Kuching": 800, + "Asia/Kuwait": 300, + "Asia/Macao": 800, + "Asia/Macau": 800, + "Asia/Magadan": 1100, + "Asia/Makassar": 800, + "Asia/Manila": 800, + "Asia/Muscat": 400, + "Asia/Nicosia": 200, + "Asia/Novokuznetsk": 700, + "Asia/Novosibirsk": 700, + "Asia/Omsk": 600, + "Asia/Oral": 500, + "Asia/Phnom_Penh": 700, + "Asia/Pontianak": 700, + "Asia/Pyongyang": 830, + "Asia/Qatar": 300, + "Asia/Qyzylorda": 600, + "Asia/Rangoon": 630, + "Asia/Riyadh": 300, + "Asia/Saigon": 700, + "Asia/Sakhalin": 1100, + "Asia/Samarkand": 500, + "Asia/Seoul": 900, + "Asia/Shanghai": 800, + "Asia/Singapore": 800, + "Asia/Srednekolymsk": 1100, + "Asia/Taipei": 800, + "Asia/Tashkent": 500, + "Asia/Tbilisi": 400, + "Asia/Tehran": 330, + "Asia/Tel_Aviv": 200, + "Asia/Thimbu": 600, + "Asia/Thimphu": 600, + "Asia/Tokyo": 900, + "Asia/Tomsk": 700, + "Asia/Ujung_Pandang": 800, + "Asia/Ulaanbaatar": 800, + "Asia/Ulan_Bator": 800, + "Asia/Urumqi": 600, + "Asia/Ust-Nera": 1000, + "Asia/Vientiane": 700, + "Asia/Vladivostok": 1000, + "Asia/Yakutsk": 900, + "Asia/Yangon": 630, + "Asia/Yekaterinburg": 500, + "Asia/Yerevan": 400, + "Atlantic/Azores": -100, + "Atlantic/Bermuda": -300, + "Atlantic/Canary": 0, + "Atlantic/Cape_Verde": -100, + "Atlantic/Faeroe": 0, + "Atlantic/Faroe": 0, + "Atlantic/Jan_Mayen": 100, + "Atlantic/Madeira": 0, + "Atlantic/Reykjavik": 0, + "Atlantic/South_Georgia": -200, + "Atlantic/St_Helena": 0, + "Atlantic/Stanley": -300, + "Australia/ACT": 1100, + "Australia/Adelaide": 1030, + "Australia/Brisbane": 1000, + "Australia/Broken_Hill": 1030, + "Australia/Canberra": 1100, + "Australia/Currie": 1100, + "Australia/Darwin": 930, + "Australia/Eucla": 845, + "Australia/Hobart": 1100, + "Australia/LHI": 1100, + "Australia/Lindeman": 1000, + "Australia/Lord_Howe": 1100, + "Australia/Melbourne": 1100, + "Australia/NSW": 1100, + "Australia/North": 930, + "Australia/Perth": 800, + "Australia/Queensland": 1000, + "Australia/South": 1030, + "Australia/Sydney": 1100, + "Australia/Tasmania": 1100, + "Australia/Victoria": 1100, + "Australia/West": 800, + "Australia/Yancowinna": 1030, + "Brazil/Acre": -500, + "Brazil/DeNoronha": -200, + "Brazil/East": -300, + "Brazil/West": -400, + "CET": 100, + "CST6CDT": -500, + "Canada/Atlantic": -300, + "Canada/Central": -500, + "Canada/East-Saskatchewan": -600, + "Canada/Eastern": -400, + "Canada/Mountain": -600, + "Canada/Newfoundland": -230, + "Canada/Pacific": -700, + "Canada/Saskatchewan": -600, + "Canada/Yukon": -700, + "Chile/Continental": -300, + "Chile/EasterIsland": -500, + "Cuba": -400, + "EET": 200, + "EST": -500, + "EST5EDT": -400, + "Egypt": 200, + "Eire": 0, + "Etc/GMT": 0, + "Etc/GMT+0": 0, + "Etc/GMT+1": -100, + "Etc/GMT+10": -1000, + "Etc/GMT+11": -1100, + "Etc/GMT+12": -1200, + "Etc/GMT+2": -200, + "Etc/GMT+3": -300, + "Etc/GMT+4": -400, + "Etc/GMT+5": -500, + "Etc/GMT+6": -600, + "Etc/GMT+7": -700, + "Etc/GMT+8": -800, + "Etc/GMT+9": -900, + "Etc/GMT-0": 0, + "Etc/GMT-1": 100, + "Etc/GMT-10": 1000, + "Etc/GMT-11": 1100, + "Etc/GMT-12": 1200, + "Etc/GMT-13": 1300, + "Etc/GMT-14": 1400, + "Etc/GMT-2": 200, + "Etc/GMT-3": 300, + "Etc/GMT-4": 400, + "Etc/GMT-5": 500, + "Etc/GMT-6": 600, + "Etc/GMT-7": 700, + "Etc/GMT-8": 800, + "Etc/GMT-9": 900, + "Etc/GMT0": 0, + "Etc/Greenwich": 0, + "Etc/UCT": 0, + "Etc/UTC": 0, + "Etc/Universal": 0, + "Etc/Zulu": 0, + "Europe/Amsterdam": 100, + "Europe/Andorra": 100, + "Europe/Astrakhan": 400, + "Europe/Athens": 200, + "Europe/Belfast": 0, + "Europe/Belgrade": 100, + "Europe/Berlin": 100, + "Europe/Bratislava": 100, + "Europe/Brussels": 100, + "Europe/Bucharest": 200, + "Europe/Budapest": 100, + "Europe/Busingen": 100, + "Europe/Chisinau": 200, + "Europe/Copenhagen": 100, + "Europe/Dublin": 0, + "Europe/Gibraltar": 100, + "Europe/Guernsey": 0, + "Europe/Helsinki": 200, + "Europe/Isle_of_Man": 0, + "Europe/Istanbul": 300, + "Europe/Jersey": 0, + "Europe/Kaliningrad": 200, + "Europe/Kiev": 200, + "Europe/Kirov": 300, + "Europe/Lisbon": 0, + "Europe/Ljubljana": 100, + "Europe/London": 0, + "Europe/Luxembourg": 100, + "Europe/Madrid": 100, + "Europe/Malta": 100, + "Europe/Mariehamn": 200, + "Europe/Minsk": 300, + "Europe/Monaco": 100, + "Europe/Moscow": 300, + "Europe/Nicosia": 200, + "Europe/Oslo": 100, + "Europe/Paris": 100, + "Europe/Podgorica": 100, + "Europe/Prague": 100, + "Europe/Riga": 200, + "Europe/Rome": 100, + "Europe/Samara": 400, + "Europe/San_Marino": 100, + "Europe/Sarajevo": 100, + "Europe/Saratov": 400, + "Europe/Simferopol": 300, + "Europe/Skopje": 100, + "Europe/Sofia": 200, + "Europe/Stockholm": 100, + "Europe/Tallinn": 200, + "Europe/Tirane": 100, + "Europe/Tiraspol": 200, + "Europe/Ulyanovsk": 400, + "Europe/Uzhgorod": 200, + "Europe/Vaduz": 100, + "Europe/Vatican": 100, + "Europe/Vienna": 100, + "Europe/Vilnius": 200, + "Europe/Volgograd": 300, + "Europe/Warsaw": 100, + "Europe/Zagreb": 100, + "Europe/Zaporozhye": 200, + "Europe/Zurich": 100, + "Factory": 0, + "GB": 0, + "GB-Eire": 0, + "GMT": 0, + "GMT+0": 0, + "GMT-0": 0, + "GMT0": 0, + "Greenwich": 0, + "HST": -1000, + "Hongkong": 800, + "Iceland": 0, + "Indian/Antananarivo": 300, + "Indian/Chagos": 600, + "Indian/Christmas": 700, + "Indian/Cocos": 630, + "Indian/Comoro": 300, + "Indian/Kerguelen": 500, + "Indian/Mahe": 400, + "Indian/Maldives": 500, + "Indian/Mauritius": 400, + "Indian/Mayotte": 300, + "Indian/Reunion": 400, + "Iran": 330, + "Israel": 200, + "Jamaica": -500, + "Japan": 900, + "Kwajalein": 1200, + "Libya": 200, + "MET": 100, + "MST": -700, + "MST7MDT": -600, + "Mexico/BajaNorte": -700, + "Mexico/BajaSur": -700, + "Mexico/General": -600, + "NZ": 1300, + "NZ-CHAT": 1345, + "Navajo": -600, + "PRC": 800, + "PST8PDT": -700, + "Pacific/Apia": 1400, + "Pacific/Auckland": 1300, + "Pacific/Bougainville": 1100, + "Pacific/Chatham": 1345, + "Pacific/Chuuk": 1000, + "Pacific/Easter": -500, + "Pacific/Efate": 1100, + "Pacific/Enderbury": 1300, + "Pacific/Fakaofo": 1300, + "Pacific/Fiji": 1200, + "Pacific/Funafuti": 1200, + "Pacific/Galapagos": -600, + "Pacific/Gambier": -900, + "Pacific/Guadalcanal": 1100, + "Pacific/Guam": 1000, + "Pacific/Honolulu": -1000, + "Pacific/Johnston": -1000, + "Pacific/Kiritimati": 1400, + "Pacific/Kosrae": 1100, + "Pacific/Kwajalein": 1200, + "Pacific/Majuro": 1200, + "Pacific/Marquesas": -930, + "Pacific/Midway": -1100, + "Pacific/Nauru": 1200, + "Pacific/Niue": -1100, + "Pacific/Norfolk": 1100, + "Pacific/Noumea": 1100, + "Pacific/Pago_Pago": -1100, + "Pacific/Palau": 900, + "Pacific/Pitcairn": -800, + "Pacific/Pohnpei": 1100, + "Pacific/Ponape": 1100, + "Pacific/Port_Moresby": 1000, + "Pacific/Rarotonga": -1000, + "Pacific/Saipan": 1000, + "Pacific/Samoa": -1100, + "Pacific/Tahiti": -1000, + "Pacific/Tarawa": 1200, + "Pacific/Tongatapu": 1300, + "Pacific/Truk": 1000, + "Pacific/Wake": 1200, + "Pacific/Wallis": 1200, + "Pacific/Yap": 1000, + "Poland": 100, + "Portugal": 0, + "ROC": 800, + "ROK": 900, + "Singapore": 800, + "Turkey": 300, + "UCT": 0, + "US/Alaska": -800, + "US/Aleutian": -900, + "US/Arizona": -700, + "US/Central": -500, + "US/East-Indiana": -400, + "US/Eastern": -400, + "US/Hawaii": -1000, + "US/Indiana-Starke": -500, + "US/Michigan": -400, + "US/Mountain": -600, + "US/Pacific": -700, + "US/Pacific-New": -700, + "US/Samoa": -1100, + "UTC": 0, + "Universal": 0, + "W-SU": 300, + "WET": 0, + "Zulu": 0, + "iso3166.tab": 0, + "posixrules": -400, + "zone.tab": 0 +} \ No newline at end of file