moment.js,时区和夏令时

时间:2013-07-09 23:00:35

标签: javascript timezone dst momentjs timezone-offset

我从.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数据库标识符(例如:&#34) ;美国/芝加哥"),但如果有更简单的方法,请告诉我。

1 个答案:

答案 0 :(得分:5)

您应该在.Net端使用Noda Time和在客户端使用moment-timezone进行探索,并传递IANA / Olson时区ID。

如果您想在下拉列表中坚持使用Windows时区ID,则可以使用Noda Time中嵌入的CLDR数据进行转换。我已在此帖中记录了如何执行此操作:How to translate between Windows and IANA time zones?

但更好的解决方案是将Windows区域全部避开。您可以使用我在此帖中描述的技术填充IANA / Olson ID列表:How should I populate a list of IANA / Olson time zones from Noda Time?

更好的是,您可以使用显示世界地图的控件(内联或模态)替换下拉列表,以便用户可以轻松选择时区。我见过的最好的控制是this one,但也有其他几个。

如果您可以严格处理IANA / Olson区域,则无需转换。您可以放弃Windows TimeZoneInfo对象,而只需使用Noda Time。如果需要,您可以只更换时区转换功能,并保持其余部分完好无损。或者,您可以全力以赴,并将所有DateTimeDateTimeOffset用途替换为Noda Time类型。这取决于你。