Javascript moment.js、时区和夏令时

Javascript moment.js、时区和夏令时,javascript,timezone,dst,momentjs,timezone-offset,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) C

我从.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或新的moment时区位来实现这一点?我认为,如果我能将标准UTC偏移量名称(例如:“中央标准时间”)映射到给定时区的DB标识符(例如:“美国/芝加哥”),这是可能的,但如果有更简单的方法,请让我知道。

您应该在.Net端和客户端探索使用,传递IANA/Olson时区id

如果您想坚持使用下拉列表中的Windows时区ID,那么您可以使用Noda time中嵌入的CLDR数据进行转换。我在这篇文章中记录了如何做到这一点:

但是更好的解决办法是避免所有的窗口区域。您可以使用我在本文中介绍的技术填充IANA/Olson ID列表:

更好的是,您可以将下拉列表替换为显示世界地图的控件(内联或模态),这样您的用户就可以轻松地选择自己的时区。我所看到的最好的控制是,但也有一些其他的


如果您可以严格在IANA/Olson区域进行交易,则无需进行转换。您可以放弃Windows
TimeZoneInfo
对象,只需使用Noda Time即可。如果你愿意,你可以只替换你的时区转换函数,其余的保持不变。或者,您可以全力以赴,将所有的
DateTime
DateTimeOffset
使用替换为Noda时间类型。这取决于您。

我最终创建了一个基于[this post][1][1]的映射器文件,这很好,但用户首选项使用时区id存储在数据库中,因此我现在只能使用它。谢谢你提醒野田佳彦。。。我来看看。。。