UTC + IANA 时区位置的时间

bsr*_*bsr 6 javascript timezone momentjs

我在这里看到了 webapp 中处理时间的一个很好的总结。但是,它没有明确解决以下情况。我想要一种根据 UTC + Location(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
}
Run Code Online (Sandbox Code Playgroud)

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

我不确定在数据库中保存时区偏移是否解决了这个问题,因为我的用户可能来自不同地区并且可能查看相同的数据。例如,事件发生在属于东部区域 (EST/EDT) 的位置,但太平洋区域的用户可以根据其位置(上午 8 点 - 下午 5 点“美国/洛杉矶”- PST/PDT)查询数据。

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

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

Mat*_*int 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
Run Code Online (Sandbox Code Playgroud)


som*_*som 5

您可以使用以下方法在没有库的情况下实现此目的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',
});
Run Code Online (Sandbox Code Playgroud)

Intl.DateTimeFormat非常相似的方式工作。

在 Chrome、Firefox 和 Safari (OSX) 上进行了测试。请注意,根据 MDN,时区属性只需要支持“UTC”,完整的 IANA 数据库可能无法在所有浏览器中实现。请随时在其他设置的支持下更新此答案。


Dan*_*Cox 2

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

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