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 浏览器中特定位置的本地时间(考虑夏令时偏移)。
原答案
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)
您可以使用以下方法在没有库的情况下实现此目的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 数据库可能无法在所有浏览器中实现。请随时在其他设置的支持下更新此答案。
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)
| 归档时间: |
|
| 查看次数: |
7234 次 |
| 最近记录: |