关于javascript:UTC + IANA时区位置的时间

Time from UTC + IANA time zone location

我在这里看到了关于webapp处理时间的精彩总结。但是,它没有明确解决以下情况。我希望能够根据UTC + Location(iana timezone location - America / New_York)的日期时间获取Web应用程序的本地时间。

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

从服务器,检索以下信息

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

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

我不确定在数据库中保存时区偏移可以解决问题,因为我的用户可能来自跨区域并且可能会查看相同的数据。例如,事件发生在属于Estern区域(EST / EDT)的位置,但太平洋区域的用户可以根据其位置查询数据(上午8点 - 下午5点"America / Los_Angeles" - PST / PDT)。

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

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


原始答案

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

您的用例是文档中描述的第一个用例之一。

更新的答案

在JavaScript中有多个用于进行时区转换的库,如此处所列。在最初询问这个问题时,我只知道TimezoneJS。

既然你问过moment.js,你应该使用moment-timezone插件。 (当您最初提出问题时,这不可用。)

1
2
3
4
5
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


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

1
2
3
4
5
6
7
8
9
10
11
12
// 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,timezone属性只需支持"UTC",并且可能无法在所有浏览器中实现完整的IANA数据库。您可以通过其他设置支持更新此答案。


MomentJS的优秀人员创建了另一个名为Moment Timezone的库。我认为这正是你要找的。特别:

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