【问题标题】:Time from UTC + IANA time zone location来自 UTC + IANA 时区位置的时间
【发布时间】:2013-01-07 05:22:54
【问题描述】:

我在 webapp here 中看到了处理时间的出色总结。但是,它并没有明确解决以下情况。我想要一种基于 UTC + Location(iana timezone location - America/New_York) 的日期时间在 Web 应用程序中获取本地时间的方法。

我正在寻找一个可以进行以下计算的库。如果它在 Javascript 中本机工作,那也符合我的目的。

从服务器获取以下信息

{
  dateTime: "2002-10-27T15:04:05Z" # Time in UTC, no TimeZone info
  userTimeZone: "America/New_York" # based on current user location
}

问题是,考虑到夏令时偏移,我找不到将其转换为位置(纽约)时间的方法。

我不确定在数据库中保存时区偏移是否能解决问题,因为我的用户可能来自不同地区并且可能查看相同的数据。例如,发生在东部地区 (EST/EDT) 的位置的事件,但太平洋地区的用户可以根据他们的位置 (8AM - 5PM "America/Los_Angeles" - PST/PDT) 查询数据。

我查看了Moment.js,但找不到解决方案。

总而言之,我需要一种方法从 UTC + IANA 位置的日期时间输入中获取 Web 浏览器中特定位置的本地时间(考虑夏令时偏移)。

【问题讨论】:

  • 你好,你最后选择了什么?

标签: javascript timezone momentjs


【解决方案1】:

原答案

MomentJS 是一个优秀的库,但它专注于解析。你需要TimezoneJS,它用javascript实现了Olson数据库。

您的用例是文档中最早描述的用例之一。

更新答案

有多个库可以在 JavaScript 中进行时区转换,as listed here。在最初提出这个问题时,我只知道 TimezoneJS。

既然您询问了 moment.js,您应该使用 moment-timezone 插件。 (当您最初提出问题时,此功能不可用。)

var x = // your object as written in the question

var m = moment(x.dateTime).tz(x.userTimeZone);

var s = m.format(); // or whatever you want to do

【讨论】:

  • stackoverflow.com/questions/6096423/… 。看起来它不是仅限客户端的解决方案
  • 纯客户端。它只需要 tz 数据文件作为静态内容。任何 tzdb 解决方案都需要它们。阅读文档 - 他们让您在 timezoneJS.timezone.zoneFileBasePath 中指定来源。
【解决方案2】:

您可以在没有库的情况下使用toLocaleDateString 方法实现此目的:

// prints 'Sun, Oct 27, 2002, 10:04 AM EST'
new Date('2002-10-27T15:04:05Z')
.toLocaleDateString('en-US', {
  timeZone:'America/New_York',
  timeZoneName: 'short',
  minute: 'numeric',
  hour: 'numeric',
  weekday: 'short',
  day: 'numeric',
  year: 'numeric',
  month: 'short',
});

Intl.DateTimeFormatvery similar 的方式工作。

在 Chrome、Firefox 和 Safari (OSX) 上测试。请注意according to MDN,时区属性只需要支持“UTC”,并且可能不会在所有浏览器中实现完整的 IANA 数据库。随时通过其他设置的支持更新此答案。

【讨论】:

    【解决方案3】:

    MomentJS 的优秀人员创建了另一个名为 Moment Timezone 的库。我认为this 正是您正在寻找的。具体来说:

    var zone = moment.tz.zone('America/New_York');
    zone.parse(Date.UTC(2012, 2, 19, 8, 30)); // 240
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多