首页 文章

moment.js,时区和夏令时

提问于
浏览
8

我从.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偏移名称(例如:"Central Standard Time")映射到给定时区的Olson数据库标识符(例如:"America/Chicago"),但如果有更简单的方法,请告诉我 .

1 回答

  • 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?

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

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

相关问题