You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					697 lines
				
				16 KiB
			
		
		
			
		
	
	
					697 lines
				
				16 KiB
			| 
											3 years ago
										 | //! moment-timezone.js
 | ||
|  | //! version : 0.5.43
 | ||
|  | //! Copyright (c) JS Foundation and other contributors
 | ||
|  | //! license : MIT
 | ||
|  | //! github.com/moment/moment-timezone
 | ||
|  | 
 | ||
|  | (function (root, factory) { | ||
|  | 	"use strict"; | ||
|  | 
 | ||
|  | 	/*global define*/ | ||
|  | 	if (typeof module === 'object' && module.exports) { | ||
|  | 		module.exports = factory(require('moment')); // Node
 | ||
|  | 	} else if (typeof define === 'function' && define.amd) { | ||
|  | 		define(['moment'], factory);                 // AMD
 | ||
|  | 	} else { | ||
|  | 		factory(root.moment);                        // Browser
 | ||
|  | 	} | ||
|  | }(this, function (moment) { | ||
|  | 	"use strict"; | ||
|  | 
 | ||
|  | 	// Resolves es6 module loading issue
 | ||
|  | 	if (moment.version === undefined && moment.default) { | ||
|  | 		moment = moment.default; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// Do not load moment-timezone a second time.
 | ||
|  | 	// if (moment.tz !== undefined) {
 | ||
|  | 	// 	logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion);
 | ||
|  | 	// 	return moment;
 | ||
|  | 	// }
 | ||
|  | 
 | ||
|  | 	var VERSION = "0.5.43", | ||
|  | 		zones = {}, | ||
|  | 		links = {}, | ||
|  | 		countries = {}, | ||
|  | 		names = {}, | ||
|  | 		guesses = {}, | ||
|  | 		cachedGuess; | ||
|  | 
 | ||
|  | 	if (!moment || typeof moment.version !== 'string') { | ||
|  | 		logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/'); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var momentVersion = moment.version.split('.'), | ||
|  | 		major = +momentVersion[0], | ||
|  | 		minor = +momentVersion[1]; | ||
|  | 
 | ||
|  | 	// Moment.js version check
 | ||
|  | 	if (major < 2 || (major === 2 && minor < 6)) { | ||
|  | 		logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com'); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/************************************ | ||
|  | 		Unpacking | ||
|  | 	************************************/ | ||
|  | 
 | ||
|  | 	function charCodeToInt(charCode) { | ||
|  | 		if (charCode > 96) { | ||
|  | 			return charCode - 87; | ||
|  | 		} else if (charCode > 64) { | ||
|  | 			return charCode - 29; | ||
|  | 		} | ||
|  | 		return charCode - 48; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function unpackBase60(string) { | ||
|  | 		var i = 0, | ||
|  | 			parts = string.split('.'), | ||
|  | 			whole = parts[0], | ||
|  | 			fractional = parts[1] || '', | ||
|  | 			multiplier = 1, | ||
|  | 			num, | ||
|  | 			out = 0, | ||
|  | 			sign = 1; | ||
|  | 
 | ||
|  | 		// handle negative numbers
 | ||
|  | 		if (string.charCodeAt(0) === 45) { | ||
|  | 			i = 1; | ||
|  | 			sign = -1; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// handle digits before the decimal
 | ||
|  | 		for (i; i < whole.length; i++) { | ||
|  | 			num = charCodeToInt(whole.charCodeAt(i)); | ||
|  | 			out = 60 * out + num; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// handle digits after the decimal
 | ||
|  | 		for (i = 0; i < fractional.length; i++) { | ||
|  | 			multiplier = multiplier / 60; | ||
|  | 			num = charCodeToInt(fractional.charCodeAt(i)); | ||
|  | 			out += num * multiplier; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return out * sign; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function arrayToInt (array) { | ||
|  | 		for (var i = 0; i < array.length; i++) { | ||
|  | 			array[i] = unpackBase60(array[i]); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function intToUntil (array, length) { | ||
|  | 		for (var i = 0; i < length; i++) { | ||
|  | 			array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		array[length - 1] = Infinity; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function mapIndices (source, indices) { | ||
|  | 		var out = [], i; | ||
|  | 
 | ||
|  | 		for (i = 0; i < indices.length; i++) { | ||
|  | 			out[i] = source[indices[i]]; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return out; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function unpack (string) { | ||
|  | 		var data = string.split('|'), | ||
|  | 			offsets = data[2].split(' '), | ||
|  | 			indices = data[3].split(''), | ||
|  | 			untils  = data[4].split(' '); | ||
|  | 
 | ||
|  | 		arrayToInt(offsets); | ||
|  | 		arrayToInt(indices); | ||
|  | 		arrayToInt(untils); | ||
|  | 
 | ||
|  | 		intToUntil(untils, indices.length); | ||
|  | 
 | ||
|  | 		return { | ||
|  | 			name       : data[0], | ||
|  | 			abbrs      : mapIndices(data[1].split(' '), indices), | ||
|  | 			offsets    : mapIndices(offsets, indices), | ||
|  | 			untils     : untils, | ||
|  | 			population : data[5] | 0 | ||
|  | 		}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/************************************ | ||
|  | 		Zone object | ||
|  | 	************************************/ | ||
|  | 
 | ||
|  | 	function Zone (packedString) { | ||
|  | 		if (packedString) { | ||
|  | 			this._set(unpack(packedString)); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	Zone.prototype = { | ||
|  | 		_set : function (unpacked) { | ||
|  | 			this.name       = unpacked.name; | ||
|  | 			this.abbrs      = unpacked.abbrs; | ||
|  | 			this.untils     = unpacked.untils; | ||
|  | 			this.offsets    = unpacked.offsets; | ||
|  | 			this.population = unpacked.population; | ||
|  | 		}, | ||
|  | 
 | ||
|  | 		_index : function (timestamp) { | ||
|  | 			var target = +timestamp, | ||
|  | 				untils = this.untils, | ||
|  | 				i; | ||
|  | 
 | ||
|  | 			for (i = 0; i < untils.length; i++) { | ||
|  | 				if (target < untils[i]) { | ||
|  | 					return i; | ||
|  | 				} | ||
|  | 			} | ||
|  | 		}, | ||
|  | 
 | ||
|  | 		countries : function () { | ||
|  | 			var zone_name = this.name; | ||
|  | 			return Object.keys(countries).filter(function (country_code) { | ||
|  | 				return countries[country_code].zones.indexOf(zone_name) !== -1; | ||
|  | 			}); | ||
|  | 		}, | ||
|  | 
 | ||
|  | 		parse : function (timestamp) { | ||
|  | 			var target  = +timestamp, | ||
|  | 				offsets = this.offsets, | ||
|  | 				untils  = this.untils, | ||
|  | 				max     = untils.length - 1, | ||
|  | 				offset, offsetNext, offsetPrev, i; | ||
|  | 
 | ||
|  | 			for (i = 0; i < max; i++) { | ||
|  | 				offset     = offsets[i]; | ||
|  | 				offsetNext = offsets[i + 1]; | ||
|  | 				offsetPrev = offsets[i ? i - 1 : i]; | ||
|  | 
 | ||
|  | 				if (offset < offsetNext && tz.moveAmbiguousForward) { | ||
|  | 					offset = offsetNext; | ||
|  | 				} else if (offset > offsetPrev && tz.moveInvalidForward) { | ||
|  | 					offset = offsetPrev; | ||
|  | 				} | ||
|  | 
 | ||
|  | 				if (target < untils[i] - (offset * 60000)) { | ||
|  | 					return offsets[i]; | ||
|  | 				} | ||
|  | 			} | ||
|  | 
 | ||
|  | 			return offsets[max]; | ||
|  | 		}, | ||
|  | 
 | ||
|  | 		abbr : function (mom) { | ||
|  | 			return this.abbrs[this._index(mom)]; | ||
|  | 		}, | ||
|  | 
 | ||
|  | 		offset : function (mom) { | ||
|  | 			logError("zone.offset has been deprecated in favor of zone.utcOffset"); | ||
|  | 			return this.offsets[this._index(mom)]; | ||
|  | 		}, | ||
|  | 
 | ||
|  | 		utcOffset : function (mom) { | ||
|  | 			return this.offsets[this._index(mom)]; | ||
|  | 		} | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	/************************************ | ||
|  | 		Country object | ||
|  | 	************************************/ | ||
|  | 
 | ||
|  | 	function Country (country_name, zone_names) { | ||
|  | 		this.name = country_name; | ||
|  | 		this.zones = zone_names; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/************************************ | ||
|  | 		Current Timezone | ||
|  | 	************************************/ | ||
|  | 
 | ||
|  | 	function OffsetAt(at) { | ||
|  | 		var timeString = at.toTimeString(); | ||
|  | 		var abbr = timeString.match(/\([a-z ]+\)/i); | ||
|  | 		if (abbr && abbr[0]) { | ||
|  | 			// 17:56:31 GMT-0600 (CST)
 | ||
|  | 			// 17:56:31 GMT-0600 (Central Standard Time)
 | ||
|  | 			abbr = abbr[0].match(/[A-Z]/g); | ||
|  | 			abbr = abbr ? abbr.join('') : undefined; | ||
|  | 		} else { | ||
|  | 			// 17:56:31 CST
 | ||
|  | 			// 17:56:31 GMT+0800 (台北標準時間)
 | ||
|  | 			abbr = timeString.match(/[A-Z]{3,5}/g); | ||
|  | 			abbr = abbr ? abbr[0] : undefined; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (abbr === 'GMT') { | ||
|  | 			abbr = undefined; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		this.at = +at; | ||
|  | 		this.abbr = abbr; | ||
|  | 		this.offset = at.getTimezoneOffset(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function ZoneScore(zone) { | ||
|  | 		this.zone = zone; | ||
|  | 		this.offsetScore = 0; | ||
|  | 		this.abbrScore = 0; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	ZoneScore.prototype.scoreOffsetAt = function (offsetAt) { | ||
|  | 		this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset); | ||
|  | 		if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) { | ||
|  | 			this.abbrScore++; | ||
|  | 		} | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	function findChange(low, high) { | ||
|  | 		var mid, diff; | ||
|  | 
 | ||
|  | 		while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) { | ||
|  | 			mid = new OffsetAt(new Date(low.at + diff)); | ||
|  | 			if (mid.offset === low.offset) { | ||
|  | 				low = mid; | ||
|  | 			} else { | ||
|  | 				high = mid; | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return low; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function userOffsets() { | ||
|  | 		var startYear = new Date().getFullYear() - 2, | ||
|  | 			last = new OffsetAt(new Date(startYear, 0, 1)), | ||
|  | 			offsets = [last], | ||
|  | 			change, next, i; | ||
|  | 
 | ||
|  | 		for (i = 1; i < 48; i++) { | ||
|  | 			next = new OffsetAt(new Date(startYear, i, 1)); | ||
|  | 			if (next.offset !== last.offset) { | ||
|  | 				change = findChange(last, next); | ||
|  | 				offsets.push(change); | ||
|  | 				offsets.push(new OffsetAt(new Date(change.at + 6e4))); | ||
|  | 			} | ||
|  | 			last = next; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		for (i = 0; i < 4; i++) { | ||
|  | 			offsets.push(new OffsetAt(new Date(startYear + i, 0, 1))); | ||
|  | 			offsets.push(new OffsetAt(new Date(startYear + i, 6, 1))); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return offsets; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function sortZoneScores (a, b) { | ||
|  | 		if (a.offsetScore !== b.offsetScore) { | ||
|  | 			return a.offsetScore - b.offsetScore; | ||
|  | 		} | ||
|  | 		if (a.abbrScore !== b.abbrScore) { | ||
|  | 			return a.abbrScore - b.abbrScore; | ||
|  | 		} | ||
|  | 		if (a.zone.population !== b.zone.population) { | ||
|  | 			return b.zone.population - a.zone.population; | ||
|  | 		} | ||
|  | 		return b.zone.name.localeCompare(a.zone.name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function addToGuesses (name, offsets) { | ||
|  | 		var i, offset; | ||
|  | 		arrayToInt(offsets); | ||
|  | 		for (i = 0; i < offsets.length; i++) { | ||
|  | 			offset = offsets[i]; | ||
|  | 			guesses[offset] = guesses[offset] || {}; | ||
|  | 			guesses[offset][name] = true; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function guessesForUserOffsets (offsets) { | ||
|  | 		var offsetsLength = offsets.length, | ||
|  | 			filteredGuesses = {}, | ||
|  | 			out = [], | ||
|  | 			i, j, guessesOffset; | ||
|  | 
 | ||
|  | 		for (i = 0; i < offsetsLength; i++) { | ||
|  | 			guessesOffset = guesses[offsets[i].offset] || {}; | ||
|  | 			for (j in guessesOffset) { | ||
|  | 				if (guessesOffset.hasOwnProperty(j)) { | ||
|  | 					filteredGuesses[j] = true; | ||
|  | 				} | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		for (i in filteredGuesses) { | ||
|  | 			if (filteredGuesses.hasOwnProperty(i)) { | ||
|  | 				out.push(names[i]); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return out; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function rebuildGuess () { | ||
|  | 
 | ||
|  | 		// use Intl API when available and returning valid time zone
 | ||
|  | 		try { | ||
|  | 			var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone; | ||
|  | 			if (intlName && intlName.length > 3) { | ||
|  | 				var name = names[normalizeName(intlName)]; | ||
|  | 				if (name) { | ||
|  | 					return name; | ||
|  | 				} | ||
|  | 				logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded."); | ||
|  | 			} | ||
|  | 		} catch (e) { | ||
|  | 			// Intl unavailable, fall back to manual guessing.
 | ||
|  | 		} | ||
|  | 
 | ||
|  | 		var offsets = userOffsets(), | ||
|  | 			offsetsLength = offsets.length, | ||
|  | 			guesses = guessesForUserOffsets(offsets), | ||
|  | 			zoneScores = [], | ||
|  | 			zoneScore, i, j; | ||
|  | 
 | ||
|  | 		for (i = 0; i < guesses.length; i++) { | ||
|  | 			zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength); | ||
|  | 			for (j = 0; j < offsetsLength; j++) { | ||
|  | 				zoneScore.scoreOffsetAt(offsets[j]); | ||
|  | 			} | ||
|  | 			zoneScores.push(zoneScore); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		zoneScores.sort(sortZoneScores); | ||
|  | 
 | ||
|  | 		return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function guess (ignoreCache) { | ||
|  | 		if (!cachedGuess || ignoreCache) { | ||
|  | 			cachedGuess = rebuildGuess(); | ||
|  | 		} | ||
|  | 		return cachedGuess; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/************************************ | ||
|  | 		Global Methods | ||
|  | 	************************************/ | ||
|  | 
 | ||
|  | 	function normalizeName (name) { | ||
|  | 		return (name || '').toLowerCase().replace(/\//g, '_'); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function addZone (packed) { | ||
|  | 		var i, name, split, normalized; | ||
|  | 
 | ||
|  | 		if (typeof packed === "string") { | ||
|  | 			packed = [packed]; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		for (i = 0; i < packed.length; i++) { | ||
|  | 			split = packed[i].split('|'); | ||
|  | 			name = split[0]; | ||
|  | 			normalized = normalizeName(name); | ||
|  | 			zones[normalized] = packed[i]; | ||
|  | 			names[normalized] = name; | ||
|  | 			addToGuesses(normalized, split[2].split(' ')); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function getZone (name, caller) { | ||
|  | 
 | ||
|  | 		name = normalizeName(name); | ||
|  | 
 | ||
|  | 		var zone = zones[name]; | ||
|  | 		var link; | ||
|  | 
 | ||
|  | 		if (zone instanceof Zone) { | ||
|  | 			return zone; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		if (typeof zone === 'string') { | ||
|  | 			zone = new Zone(zone); | ||
|  | 			zones[name] = zone; | ||
|  | 			return zone; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		// Pass getZone to prevent recursion more than 1 level deep
 | ||
|  | 		if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) { | ||
|  | 			zone = zones[name] = new Zone(); | ||
|  | 			zone._set(link); | ||
|  | 			zone.name = names[name]; | ||
|  | 			return zone; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function getNames () { | ||
|  | 		var i, out = []; | ||
|  | 
 | ||
|  | 		for (i in names) { | ||
|  | 			if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) { | ||
|  | 				out.push(names[i]); | ||
|  | 			} | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return out.sort(); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function getCountryNames () { | ||
|  | 		return Object.keys(countries); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function addLink (aliases) { | ||
|  | 		var i, alias, normal0, normal1; | ||
|  | 
 | ||
|  | 		if (typeof aliases === "string") { | ||
|  | 			aliases = [aliases]; | ||
|  | 		} | ||
|  | 
 | ||
|  | 		for (i = 0; i < aliases.length; i++) { | ||
|  | 			alias = aliases[i].split('|'); | ||
|  | 
 | ||
|  | 			normal0 = normalizeName(alias[0]); | ||
|  | 			normal1 = normalizeName(alias[1]); | ||
|  | 
 | ||
|  | 			links[normal0] = normal1; | ||
|  | 			names[normal0] = alias[0]; | ||
|  | 
 | ||
|  | 			links[normal1] = normal0; | ||
|  | 			names[normal1] = alias[1]; | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function addCountries (data) { | ||
|  | 		var i, country_code, country_zones, split; | ||
|  | 		if (!data || !data.length) return; | ||
|  | 		for (i = 0; i < data.length; i++) { | ||
|  | 			split = data[i].split('|'); | ||
|  | 			country_code = split[0].toUpperCase(); | ||
|  | 			country_zones = split[1].split(' '); | ||
|  | 			countries[country_code] = new Country( | ||
|  | 				country_code, | ||
|  | 				country_zones | ||
|  | 			); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function getCountry (name) { | ||
|  | 		name = name.toUpperCase(); | ||
|  | 		return countries[name] || null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function zonesForCountry(country, with_offset) { | ||
|  | 		country = getCountry(country); | ||
|  | 
 | ||
|  | 		if (!country) return null; | ||
|  | 
 | ||
|  | 		var zones = country.zones.sort(); | ||
|  | 
 | ||
|  | 		if (with_offset) { | ||
|  | 			return zones.map(function (zone_name) { | ||
|  | 				var zone = getZone(zone_name); | ||
|  | 				return { | ||
|  | 					name: zone_name, | ||
|  | 					offset: zone.utcOffset(new Date()) | ||
|  | 				}; | ||
|  | 			}); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		return zones; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function loadData (data) { | ||
|  | 		addZone(data.zones); | ||
|  | 		addLink(data.links); | ||
|  | 		addCountries(data.countries); | ||
|  | 		tz.dataVersion = data.version; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function zoneExists (name) { | ||
|  | 		if (!zoneExists.didShowError) { | ||
|  | 			zoneExists.didShowError = true; | ||
|  | 				logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')"); | ||
|  | 		} | ||
|  | 		return !!getZone(name); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function needsOffset (m) { | ||
|  | 		var isUnixTimestamp = (m._f === 'X' || m._f === 'x'); | ||
|  | 		return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function logError (message) { | ||
|  | 		if (typeof console !== 'undefined' && typeof console.error === 'function') { | ||
|  | 			console.error(message); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	/************************************ | ||
|  | 		moment.tz namespace | ||
|  | 	************************************/ | ||
|  | 
 | ||
|  | 	function tz (input) { | ||
|  | 		var args = Array.prototype.slice.call(arguments, 0, -1), | ||
|  | 			name = arguments[arguments.length - 1], | ||
|  | 			zone = getZone(name), | ||
|  | 			out  = moment.utc.apply(null, args); | ||
|  | 
 | ||
|  | 		if (zone && !moment.isMoment(input) && needsOffset(out)) { | ||
|  | 			out.add(zone.parse(out), 'minutes'); | ||
|  | 		} | ||
|  | 
 | ||
|  | 		out.tz(name); | ||
|  | 
 | ||
|  | 		return out; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	tz.version      = VERSION; | ||
|  | 	tz.dataVersion  = ''; | ||
|  | 	tz._zones       = zones; | ||
|  | 	tz._links       = links; | ||
|  | 	tz._names       = names; | ||
|  | 	tz._countries	= countries; | ||
|  | 	tz.add          = addZone; | ||
|  | 	tz.link         = addLink; | ||
|  | 	tz.load         = loadData; | ||
|  | 	tz.zone         = getZone; | ||
|  | 	tz.zoneExists   = zoneExists; // deprecated in 0.1.0
 | ||
|  | 	tz.guess        = guess; | ||
|  | 	tz.names        = getNames; | ||
|  | 	tz.Zone         = Zone; | ||
|  | 	tz.unpack       = unpack; | ||
|  | 	tz.unpackBase60 = unpackBase60; | ||
|  | 	tz.needsOffset  = needsOffset; | ||
|  | 	tz.moveInvalidForward   = true; | ||
|  | 	tz.moveAmbiguousForward = false; | ||
|  | 	tz.countries    = getCountryNames; | ||
|  | 	tz.zonesForCountry = zonesForCountry; | ||
|  | 
 | ||
|  | 	/************************************ | ||
|  | 		Interface with Moment.js | ||
|  | 	************************************/ | ||
|  | 
 | ||
|  | 	var fn = moment.fn; | ||
|  | 
 | ||
|  | 	moment.tz = tz; | ||
|  | 
 | ||
|  | 	moment.defaultZone = null; | ||
|  | 
 | ||
|  | 	moment.updateOffset = function (mom, keepTime) { | ||
|  | 		var zone = moment.defaultZone, | ||
|  | 			offset; | ||
|  | 
 | ||
|  | 		if (mom._z === undefined) { | ||
|  | 			if (zone && needsOffset(mom) && !mom._isUTC) { | ||
|  | 				mom._d = moment.utc(mom._a)._d; | ||
|  | 				mom.utc().add(zone.parse(mom), 'minutes'); | ||
|  | 			} | ||
|  | 			mom._z = zone; | ||
|  | 		} | ||
|  | 		if (mom._z) { | ||
|  | 			offset = mom._z.utcOffset(mom); | ||
|  | 			if (Math.abs(offset) < 16) { | ||
|  | 				offset = offset / 60; | ||
|  | 			} | ||
|  | 			if (mom.utcOffset !== undefined) { | ||
|  | 				var z = mom._z; | ||
|  | 				mom.utcOffset(-offset, keepTime); | ||
|  | 				mom._z = z; | ||
|  | 			} else { | ||
|  | 				mom.zone(offset, keepTime); | ||
|  | 			} | ||
|  | 		} | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	fn.tz = function (name, keepTime) { | ||
|  | 		if (name) { | ||
|  | 			if (typeof name !== 'string') { | ||
|  | 				throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']'); | ||
|  | 			} | ||
|  | 			this._z = getZone(name); | ||
|  | 			if (this._z) { | ||
|  | 				moment.updateOffset(this, keepTime); | ||
|  | 			} else { | ||
|  | 				logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/."); | ||
|  | 			} | ||
|  | 			return this; | ||
|  | 		} | ||
|  | 		if (this._z) { return this._z.name; } | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	function abbrWrap (old) { | ||
|  | 		return function () { | ||
|  | 			if (this._z) { return this._z.abbr(this); } | ||
|  | 			return old.call(this); | ||
|  | 		}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function resetZoneWrap (old) { | ||
|  | 		return function () { | ||
|  | 			this._z = null; | ||
|  | 			return old.apply(this, arguments); | ||
|  | 		}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	function resetZoneWrap2 (old) { | ||
|  | 		return function () { | ||
|  | 			if (arguments.length > 0) this._z = null; | ||
|  | 			return old.apply(this, arguments); | ||
|  | 		}; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	fn.zoneName  = abbrWrap(fn.zoneName); | ||
|  | 	fn.zoneAbbr  = abbrWrap(fn.zoneAbbr); | ||
|  | 	fn.utc       = resetZoneWrap(fn.utc); | ||
|  | 	fn.local     = resetZoneWrap(fn.local); | ||
|  | 	fn.utcOffset = resetZoneWrap2(fn.utcOffset); | ||
|  | 
 | ||
|  | 	moment.tz.setDefault = function(name) { | ||
|  | 		if (major < 2 || (major === 2 && minor < 9)) { | ||
|  | 			logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.'); | ||
|  | 		} | ||
|  | 		moment.defaultZone = name ? getZone(name) : null; | ||
|  | 		return moment; | ||
|  | 	}; | ||
|  | 
 | ||
|  | 	// Cloning a moment should include the _z property.
 | ||
|  | 	var momentProperties = moment.momentProperties; | ||
|  | 	if (Object.prototype.toString.call(momentProperties) === '[object Array]') { | ||
|  | 		// moment 2.8.1+
 | ||
|  | 		momentProperties.push('_z'); | ||
|  | 		momentProperties.push('_a'); | ||
|  | 	} else if (momentProperties) { | ||
|  | 		// moment 2.7.0
 | ||
|  | 		momentProperties._z = null; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// INJECT DATA
 | ||
|  | 
 | ||
|  | 	return moment; | ||
|  | })); |