【问题标题】:Getting timezone from offset in javascript从javascript中的偏移量获取时区
【发布时间】:2020-12-04 21:27:54
【问题描述】:

我需要在以 UTC 时间运行的服务器上触发基于时间的事件。
在我的 UI 中,我接受 2 个参数

  1. 需要运行的触发器的本地时间
  2. 时区偏移

我宁愿不显示时区名称,因为它会延迟页面呈现,我认为它是不必要的。

我检查了时刻库,但没有看到如何从时区偏移中获取时区名称。 API moment.tz.names() 返回所有时区。

是否有返回的 API,比如说 moment.tz.name('330') = 'Asia/Kolkata' 另外,如果有解决方案,DST问题会得到解决吗

【问题讨论】:

  • 您需要的信息是否在“新日期()”中(对我来说是:2017 年 2 月 23 日星期四 16:54:19 GMT+0100(巴黎,马德里))。如果是的话,我可以给你一个正则表达式来提取它们。
  • example.. 你可以给一个自定义时间,比如 17 小时和 00 分钟,来运行一个事件。此外,您将发送 +1 作为偏移量。服务器位于 UTC 时区。它必须在格林威治标准时间 17:00:00 +0100 运行事件
  • 所以你只需要偏移量吗? +1
  • 不,没有从偏移量返回时区名称的API,我担心无法从偏移量获得这种输出,请参阅here
  • 客户端应该发送一个UTC日期,这样会更容易。因此,如果用户选择 17:00(+1 GMT),它会发送 18:00

标签: javascript momentjs


【解决方案1】:

因此,任何特定偏移量总是/经常有多个名称,因此我不知道 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 不 100% 匹配,但它演示了如何解决该问题。您还可以获取所有时区名称及其偏移量的数组,例如 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,即@987654329 @ 在您的用例中。

【讨论】:

    【解决方案2】:

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

    有一个示例in the documentation 与您的场景非常匹配。

    ...

    如果您想仅使用数字输入值构建具有特定时区偏移的时刻,则此功能的一个用途是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 2014-01-09
      • 1970-01-01
      • 2014-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多