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 |
您可以使用
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', }); |
在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 |