7

我在这里看到了 webapp 处理时间的精彩总结。但是,它并没有明确解决以下情况。我想要一种基于 UTC + 位置(iana 时区位置 - 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 浏览器中特定位置的本地时间(考虑夏令时偏移)。

4

3 回答 3

5

原始答案

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

您的用例是文档中首先描述的用例之一。

更新的答案

有多个库用于在 JavaScript 中进行时区转换,如此处所列。在最初提出这个问题时,我只知道 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
于 2013-01-23T16:41:20.040 回答
4

您可以使用以下方法在没有库的情况下实现此目的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.DateTimeFormat非常相似的方式工作。

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

于 2018-01-18T11:21:47.923 回答
2

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

var zone = moment.tz.zone('America/New_York');
zone.parse(Date.UTC(2012, 2, 19, 8, 30)); // 240
于 2014-09-03T01:26:09.760 回答