提问人:WoJ 提问时间:9/21/2023 更新时间:9/21/2023 访问量:108
如何获取特定时区的时区偏移量?
How to get the timezone offset for a specific timezone?
问:
我需要根据城市的时区(作为 TZ 标识符)对城市进行排序。为此,我发现最自然的方法是将这些时区的偏移量与UTC进行比较(但我对任何解决方案都持开放态度)。
Date.prototype.getTimezoneOffset()
似乎是完美的候选者,我从文档中举了一个例子:
const myDate = new Date('August 19, 1975 23:15:30 GMT+07:00')
console.log(myDate.getTimezoneOffset())
示例的注释指出
预期输出:您的本地时区偏移量(以分钟
为单位)//(例如,-120)。不是日期对象的时区偏移量。
我正在尝试处理这个问题,但我根本不明白如果它总是将本地偏移返回给 UTS,无论它应用于什么日期,该怎么办。Date.prototype.getTimezoneOffset()
如果以上是正确的(这看起来很奇怪,应用于日期对象),我怎样才能获得日期对象的 UTC 偏移量?getTimezoneOffset()
我最终将使用 Day.js 来操作我的日期,因此我期望工作的最终代码(但并非如此)是
console.log(dayjs().tz('America/Los_Angeles').toDate().getTimezoneOffset())
答:
1赞
Alexander Nenashev
9/21/2023
#1
JS 日期不包含时区信息,为您提供特定日期的本地时区偏移量:getTimezoneOffset()
let myDate = new Date('August 19, 1975 23:15:30 GMT+07:00')
console.log(myDate.getTimezoneOffset())
myDate = new Date('August 19, 2023 23:15:30 GMT+03:00')
console.log(myDate.getTimezoneOffset())
/* gives for my region (timezone in the strings doesn't affect this):
-180
-120
*/
直接解析日期字符串。 如果要按时区名称获取时区偏移量:
function getTimezoneOffset(timeZone){
const str = new Date().toLocaleString('en', {timeZone, timeZoneName: 'longOffset'});
const [_,h,m] = str.match(/([+-]\d+):(\d+)$/) || [, '+00', '00'];
return h * 60 + (h > 0 ? +m : -m);
}
'America/Los_Angeles America/New_York Asia/Kolkata Pacific/Marquesas Etc/UTC'.match(/\S+/g).forEach(tz =>
console.log(tz, getTimezoneOffset(tz))
);
要从日期字符串进行解析:
function getTimezoneOffset(str){
const [_,h,m] = str.match(/([+-]\d+):(\d+)$/) || [, '+00', '00'];
return h * 60 + (h > 0 ? +m : -m);
}
console.log(getTimezoneOffset('August 19, 1975 23:15:30 GMT+07:00'))
评论
0赞
WoJ
9/21/2023
getTimezoneOffset()
为您提供特定日期的本地时区偏移量这是我不明白的部分。 应用于日期对象(可以采用 GMT+8 格式),但它无论如何都会给出与本地时区的偏移量?因此,它应用于哪个日期对象并不重要?getTimezoneOffset()
0赞
Alexander Nenashev
9/21/2023
@WoJ例如,我在 1975 年有 GMT+3,现在我所在的地区有 GMT+2。因此,这与调用 getTimezoneOffset() 的日期无关。用一个片段更新了我的答案。不要犹豫,接受并点赞,谢谢
0赞
RobG
9/22/2023
@WoJ - ECMAScript Date 对象没有时区。它唯一的数据属性是从 1 Jan 1970 00:00:00 UTC 的偏移量(以毫秒为单位),称为时间值。当解析具有偏移量的时间戳时,它会被解析为一个时间值,因此有效地成为 UTC。原始时间戳中的时区或偏移量不会存储为日期的一部分。
0赞
WoJ
9/22/2023
@RobG:感谢您的澄清。在这种情况下,如果 1973 年和 2023 年的同一天之间存在差异,这是否意味着偏移量在此期间发生了变化(因为引入/放弃了 DST,或者时区的定义发生了变化)?
0赞
Alexander Nenashev
9/22/2023
@WoJ是的,正如我在第一个片段中解释的那样
评论