我在亚洲,我想计算澳大利亚的偏移量。我知道如何计算偏移量的值,代码如下:
var timezone_offset = new Date().getTimezoneOffset();
但其他地点如何计算呢?有人可以指导我吗??
虽然这can如果要在一个简短的函数中完成,最好使用一个库,因为有许多怪癖需要克服。可以使用时区选项来确定偏移量到区域设置字符串 or 国际日期时间格式.
但是,如果用于格式化的语言与位置的语言匹配,它将返回时区缩写而不是偏移量。为了解决这个问题,以下函数首先使用英语,如果返回缩写而不是偏移量,则它使用法语。英语偏移量以 GMT 开始,法语偏移量以 UTC 开始。当偏移量为 +0 时,它们仅返回“GMT”或“UTC”。
它已在列出的所有 IANA 位置进行了测试维基百科似乎对所有这些都有效,但应该进行更广泛的测试。此外,在尝试运行之前应该进行功能测试(即支持整数日期时间格式构造函数,格式化为零件方法和时区名称选项)。
// Return offset on date for loc in ±H[:mm] format. Minutes only included if not zero
function getTimezoneOffset(date, loc) {
// Try English to get offset. If get abbreviation, use French
let offset;
['en','fr'].some(lang => {
// Get parts - can't get just timeZoneName, must get one other part at least
let parts = new Intl.DateTimeFormat(lang, {
minute: 'numeric',
timeZone: loc,
timeZoneName:'short'
}).formatToParts(date);
// Get offset from parts
let tzName = parts.filter(part => part.type == 'timeZoneName' && part.value);
// timeZoneName starting with GMT or UTC is offset - keep and stop looping
// Otherwise it's an abbreviation, keep looping
if (/^(GMT|UTC)/.test(tzName[0].value)) {
offset = tzName[0].value.replace(/GMT|UTC/,'') || '+0';
return true;
}
});
// Format offset as ±HH:mm
// Normalise minus sign as ASCII minus (charCode 45)
let sign = offset[0] == '\x2b'? '\x2b' : '\x2d';
let [h, m] = offset.substring(1).split(':');
return sign + h.padStart(2, '0') + ':' + (m || '00');
}
let d = new Date();
console.log('Current offset for following locations:');
['Australia/Yancowinna',
'Australia/Lord_Howe',
'Australia/Canberra',
'Pacific/Honolulu',
'Europe/London',
'Canada/Eastern'
].forEach( loc =>
console.log(loc + ': ' + getTimezoneOffset(d, loc))
);
我不建议你使用这个函数,它实际上是为了展示获取特定位置的偏移量是多么混乱。
请注意,澳大利亚有许多补偿措施,有些地方实行夏令时,有些地方则不实行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)