date-fns-tz
Version:
Time zone support for date-fns v2 with the browser Intl API
82 lines (66 loc) • 1.95 kB
JavaScript
import tzTokenizeDate from '../tzTokenizeDate/index.js'
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
export default 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) {
// var [fYear, fMonth, fDay, fHour, fMinute, fSecond] = tzTokenizeDate(date, timezoneString)
var tokens = tzTokenizeDate(date, timezoneString)
var asUTC = Date.UTC(
tokens[0],
tokens[1] - 1,
tokens[2],
tokens[3],
tokens[4],
tokens[5]
)
var timestampWithMsZeroed = date.getTime() - (date.getTime() % 1000)
return -(asUTC - timestampWithMsZeroed)
}
return 0
}
function validateTimezone(hours, minutes) {
if (minutes != null && (minutes < 0 || minutes > 59)) {
return false
}
return true
}