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时间类型替换您的所有DateTimeDateTimeOffset用法。 随你便。

链接地址: http://www.djcxy.com/p/29375.html

上一篇: moment.js, timezones and daylight savings

下一篇: JavaScript, time zones, and daylight savings time