如何在JavaScript中从IANA时区代码获取时区偏移?

5

我有一个类似于"亚洲/加尔各答"的 IANA 时区代码,我需要在JavaScript中获取时区偏移,例如-330。但我无法获得时区偏移,希望能得到帮助。


@OmSao 在 Date() 对象上使用 getTimezoneOffset() 将会给出浏览器时区的时间偏移量。我需要特定 IANI 时区偏移量,例如 "Asia/Kolkata"。 - Shb
你需要使用一些JS框架,比如moment.js或者TimeZoneJS。仅仅使用JavaScript是不可能的。 - Om Sao
6个回答

3
使用原生的 Date.toLocaleString API:
function timeZoneOffsetInMinutes(ianaTimeZone) {
  const now = new Date();
  now.setSeconds(0, 0);

  // Format current time in `ianaTimeZone` as `M/DD/YYYY, HH:MM:SS`:
  const tzDateString = now.toLocaleString('en-US', {
    timeZone: ianaTimeZone,
    hourCycle: 'h23',
  });

  // Parse formatted date string:
  const match = /(\d+)\/(\d+)\/(\d+), (\d+):(\d+)/.exec(tzDateString);
  const [_, month, day, year, hour, min] = match.map(Number);

  // Change date string's time zone to UTC and get timestamp:
  const tzTime = Date.UTC(year, month - 1, day, hour, min);

  // Return the offset between UTC and target time zone:
  return Math.floor((tzTime - now.getTime()) / (1000 * 60));
}

2

我希望借此机会向您推荐moment.js,它是一个非常棒的日期/时间库,支持我所需的所有功能。

例如:

moment().tz("Asia/Kolkata").offset(...)

可用于处理时区。


1
我建议在新项目中不要包含moment.js,因为该库的维护者已宣布其已被弃用。https://momentjs.com/docs/#/-project-status/该公告附带了一份建议替代方案列表,包括不使用库。我在网上搜索时遇到了这个问题,想知道是否有本地JS解决方案。 - Michael Scheper

1
这可以使用tzdb库来实现,该库承诺与IANA数据库保持最新。
const kolkataTimeZone = timeZones.find( ({name}) => name === 'Asia/Kolkata' );
console.log(kolkataTimeZone.rawOffsetInMinutes); // 330

请注意,与已弃用的moment.js库不同,偏移量是逻辑上有符号的,即UTC之后的时区(主要是美洲)为负,UTC之前的时区(世界大部分人口)为正。

1

你也可以使用Luxon来完成它。

import { DateTime } from 'luxon'
    
export function getOffsetFromIANATimezone (ianaTimezone: string): number {
  const dt =DateTime.now().setZone(ianaTimezone)
  return (dt.offset / 60)
}

1
你可以使用dayjs来实现这一点,它是弃用的moment库的良好替代品。
import dayjs from 'dayjs'
import utc from 'dayjs/plugin/utc'
import timezone from 'dayjs/plugin/timezone'
dayjs.extend(utc)
dayjs.extend(timezone)

dayjs.tz(undefined, 'Asia/Kolkata').format('ZZ')

1
不要忘记扩展 dayjs.extend(utc) dayjs.extend(timezone) - ihor.eth
@ihorbond 好主意!刚刚编辑了。 - Connor Dooley

0

我已经想出如何在JavaScript中从IANA时区代码获取时区偏移量。我使用了moment-timezone-with-data.js,如下所示:

var zone = moment.tz.zone('Asia/Kolkata');
zone.parse(Date.UTC(2012, 2, 19, 8, 30)); // -330

这在2020年并不是一个解决方案,因为该库已被弃用。http://momentjs.com/docs/#/-project-status - Michael Scheper
@MichaelScheper 我看到 npm 的 moment-timezone 库在 6 个月前有更新。这个库可以安全使用吗? - elizaburkey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接