我从.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 回答
您应该在.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类型替换所有DateTime
和DateTimeOffset
用途 . 由你决定 .