moment.js,时区和夏令时
我从.Net服务返回UTC日期/时间列表,格式如下:
"2013-07-09 19:48:07 +00:00".
在客户端,我将每个这些字符串值转换为相应的基于UTC的时刻,就像这样
var fooUtc = new moment.utc(serverDateTimeString)
在页面上,有一个包含用户可以更改的时区列表的下垂。 这些绑定到时区对象的集合,如下所示:
{
id: "Central Standard Time",
label: "(UTC-06:00) Central Time (US & Canada)",
observesDaylightSavings: true,
baseUtcOffset: {
asHours: -6,
asMinutes: -360,
asText: "-06:00"
}
然后,我会显示每个传入所选时区偏移量的时刻,如下所示:
fooUtc.local().zone(selectedTimeZone.baseUtcOffset.asMinutes).format()
但是,结果并未考虑夏令时,因为来自.Net的时区数据不区分dst和非dst偏移量。
有没有办法通过moment.js或新的时刻 - 时区位来完成这项工作? 我认为如果我可以将标准的UTC偏移量名称(例如:“中央标准时间”)映射到给定时区的Olson数据库标识符(例如:“America / Chicago”),但如果有更简单的方法,让我知道。
您应该在.Net端使用Noda Time,并在客户端使用IANA / Olson时区标识。
如果您想要在下拉列表中坚持使用Windows时区ID,则可以使用Noda Time中嵌入的CLDR数据进行转换。 我已经记录了如何在这篇文章中做到这一点:如何在Windows和IANA时区之间进行翻译?
但更好的解决方案是避免Windows区域一起。 您可以使用我在本文中描述的技术填充IANA / Olson ID列表:我应该如何从Noda Time填充IANA / Olson时区列表?
更好的是,您可以使用显示世界地图的控件(内联或模式)替换您的下拉列表,以便用户可以轻松选择他们的时区。 我所见过的最好的控制是这个,但也有一些其他的。
如果您可以严格在IANA / Olson区域进行交易,则不需要转换。 您可以放弃Windows TimeZoneInfo
对象,而只是使用Noda Time。 如果你愿意,你可以只替换你的时区转换函数,并保持其它的完整。 或者,您可以全力以赴,用Noda时间类型替换您的所有DateTime
和DateTimeOffset
用法。 随你便。