从偏移量中获取时区的 JavaScript 方法

4
我需要在运行在UTC时区的服务器上触发基于时间的事件。
在我的用户界面中,我接受2个参数:
  1. 需要运行的触发器的本地时间
  2. 时区偏移量
我更喜欢不显示时区名称,因为这会延迟页面渲染,而且我认为这是不必要的。
我检查了moment库,但我不知道如何从时区偏移量获取时区名称。API moment.tz.names() 返回所有时区。
是否有一个API可以返回,比如 moment.tz.name('330') = 'Asia/Kolkata' 另外,如果有解决方案,夏令时问题会得到解决吗?

2
你需要的信息是否在 'new Date()' 中(对我来说是这样的:Thu Feb 23 2017 16:54:19 GMT+0100 (Paris, Madrid))?如果是的话,我可以为你制作一个正则表达式来提取它们。 - Alexandre Nicolas
1
你可以设置一个自定义时间,比如17点00分,来运行一个事件。此外,你需要发送+1作为偏移量。服务器位于UTC时区。它必须在GMT +0100的17:00:00运行事件。 - Faiz Mohamed Haneef
1
所以你只需要偏移量吗?+1? - Alexandre Nicolas
2
不,没有API可以从偏移返回时区名称,我担心无法从偏移获取此类输出,请参见这里 - VincenzoC
1
Kornflexx,VincenzoC.. 我相信一个简单的JS日期+偏移量计算对我来说就足够了。虽然我会失去DST。我想知道是否同一时区偏移量可以遵循不同的DST开始/结束日期。 - Faiz Mohamed Haneef
显示剩余2条评论
2个回答

3

因此,对于任何特定的偏移量,可能会有多个名称,所以我不知道是否存在 moment.tz.name('offset') = 'Country/Zone' 的API。

然而,您可以使用一个简单的过滤函数获取基于偏移量的所有名称的数组。

const moment = require('moment-timezone');

const getZoneFromOffset = offsetString => moment.tz.names().filter(tz => moment.tz(tz).format('Z') === offsetString)

console.log(getZoneFromOffset("+05:30"))
// [ 'Asia/Calcutta', 'Asia/Colombo', 'Asia/Kolkata' ]

在上面的示例中,我使用了"+05:30"作为偏移值,这并不完全符合您使用330的情况,但它展示了如何解决问题。您还可以通过在moment.tz.names()上进行简单映射来获取所有时区名称及其偏移量的数组。
const getZoneObjects = () =>  moment.tz.names().map(zone => ({ zone, offset: moment.tz(zone).format('Z') }))

/*
[
  { zone: 'Africa/Abidjan', offset: '+00:00' },
  { zone: 'Africa/Accra', offset: '+00:00' },
  { zone: 'Africa/Addis_Ababa', offset: '+03:00' },
  ...
*/

上述示例使用Z作为时区格式,但如果"+5:30"不符合您的需求,您可以查看https://devhints.io/moment以查看其他可用格式,例如ZZ,在您的用例中将是"+0530"

1

使用固定偏移量时,您不需要使用Moment-Timezone。所有这些功能都由Moment本身提供,使用parseZoneutcOffset函数。

文档中有一个示例非常符合您的情况。

...

One use of this feature is if you want to construct a moment with a specific time zone offset using only numeric input values:

moment([2016, 0, 1, 0, 0, 0]).utcOffset(-5, true) // Equivalent to "2016-01-01T00:00:00-05:00"

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