date-fns-tz
Version:
Time zone support for date-fns v2 with the browser Intl API
85 lines (60 loc) • 2.17 kB
JavaScript
;
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;