使用字符串解析或 C# 库
我找到了 2 个解决方案,它们可以为我提供所需的数据,但两者都非常糟糕和 hacky。
- 在前端,调用 moment 的
.toString()
函数并对结果进行模式匹配以获取时区名称。
这可以使用正则表达式来完成,或者.split()
它可以工作,假设日期字符串的格式永远不会改变。它看起来像:
var timeZoneName = momentDate._d.toString().split("(")[1].split(")")[0];
//timeZoneName now holds "Pacific Daylight Time"
将该值传递到后端后,您仍然需要将“Daylight”替换为“Standard”以创建 TimeZoneInfo 实例。
- 在后端,使用外部库为您进行映射。
我找到的两个库是TimeZoneNames和TimeZoneConverter。这些可以采用 IANA 样式的名称并将它们与它们的 Windows 标准等效项匹配。我使用 TimeZoneConverter 像:
localTZName = TZConvert.IanaToWindows(tzName);
TimeZoneInfo localTimeZone = TimeZoneInfo.FindSystemTimeZoneById(localTZName);
tzName 是在moment.tz.guess()
前端使用的结果。这种方法效果很好,但它相当于制作从一种风格到另一种风格的地图,所以我很高兴其他人经历了这种痛苦,所以我不必这样做。
这两种解决方案都很糟糕,但似乎没有办法解决它们
第一个解决方案依赖于希望时刻的字符串表示永远不会改变,并且时刻真的应该有一种方法来获取这个特定的数据,而不必从字符串中删除它,特别是因为他们已经经历了找到数据,他们就是不让你拥有它。
第二种解决方案只是蛮力映射。不优雅,丑陋,但它可以工作,虽然它真的感觉它应该是moment.tz.js或TimeZoneInfo,或者最好是两者都原生的东西。
这种脱节似乎来自这样一个事实,即 moment.js 拒绝承认 Windows 的存在,而 Windows 拒绝承认时区是复杂的野兽,具有许多可以影响准确约会的历史。