UNPKG

date-fns-tz

Version:

Time zone support for date-fns v2 with the browser Intl API

85 lines (60 loc) 2.17 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = tzParseTimezone; var _index = _interopRequireDefault(require("../tzTokenizeDate/index.js")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var MILLISECONDS_IN_HOUR = 3600000; var MILLISECONDS_IN_MINUTE = 60000; var patterns = { timezone: /([Z+-].*)$/, timezoneZ: /^(Z)$/, timezoneHH: /^([+-])(\d{2})$/, timezoneHHMM: /^([+-])(\d{2}):?(\d{2})$/, timezoneIANA: /(UTC|(?:[a-zA-Z]+\/[a-zA-Z_]+(?:\/[a-zA-Z_]+)?))$/ }; // Parse various time zone offset formats to an offset in milliseconds function tzParseTimezone(timezoneString, date) { var token; var absoluteOffset; // Z token = patterns.timezoneZ.exec(timezoneString); if (token) { return 0; } var hours; // ±hh token = patterns.timezoneHH.exec(timezoneString); if (token) { hours = parseInt(token[2], 10); if (!validateTimezone(hours)) { return NaN; } absoluteOffset = hours * MILLISECONDS_IN_HOUR; return token[1] === '+' ? -absoluteOffset : absoluteOffset; } // ±hh:mm or ±hhmm token = patterns.timezoneHHMM.exec(timezoneString); if (token) { hours = parseInt(token[2], 10); var minutes = parseInt(token[3], 10); if (!validateTimezone(hours, minutes)) { return NaN; } absoluteOffset = hours * MILLISECONDS_IN_HOUR + minutes * MILLISECONDS_IN_MINUTE; return token[1] === '+' ? -absoluteOffset : absoluteOffset; } // IANA time zone token = patterns.timezoneIANA.exec(timezoneString); if (token) { date = new Date(date || Date.now()); date.setMilliseconds(0); // var [fYear, fMonth, fDay, fHour, fMinute, fSecond] = tzTokenizeDate(date, timezoneString) var tokens = (0, _index.default)(date, timezoneString); var asUTC = Date.UTC(tokens[0], tokens[1] - 1, tokens[2], tokens[3], tokens[4], tokens[5]); return -(asUTC - date.getTime()); } return 0; } function validateTimezone(hours, minutes) { if (minutes != null && (minutes < 0 || minutes > 59)) { return false; } return true; } module.exports = exports.default;