1

我正在开发一个 asp.net 项目,在服务器上的数据库和在客户端上显示它们的小部件之间处理各种日期和时间。我正在尝试使用 moment.js。

当我调试我的时刻对象时,我看到以下信息:

样本数据

我需要使用“太平洋夏令时间”部分,因为这是 TimeZoneInfo c# 类(我在后端使用)接受的唯一字符串格式。

我如何获得那条数据?

我已经阅读了文档和指南,与时区的“标准”名称无关,只有像“美国/洛杉矶”这样的城市名称,这是不合适的。我可以制作一个将城市名称映射到标准名称的字典,但这需要很长时间并且很痛苦,所以我想找到正确的方法来做到这一点。

4

1 回答 1

1

使用字符串解析或 C# 库

我找到了 2 个解决方案,它们可以为我提供所需的数据,但两者都非常糟糕和 hacky。

  1. 在前端,调用 moment 的.toString()函数并对结果进行模式匹配以获取时区名称。

这可以使用正则表达式来完成,或者.split()它可以工作,假设日期字符串的格式永远不会改变。它看起来像:

var timeZoneName = momentDate._d.toString().split("(")[1].split(")")[0];
//timeZoneName now holds "Pacific Daylight Time"

将该值传递到后端后,您仍然需要将“Daylight”替换为“Standard”以创建 TimeZoneInfo 实例。

  1. 在后端,使用外部库为您进行映射。

我找到的两个库是TimeZoneNamesTimeZoneConverter。这些可以采用 IANA 样式的名称并将它们与它们的 Windows 标准等效项匹配。我使用 TimeZoneConverter 像:

localTZName = TZConvert.IanaToWindows(tzName);
TimeZoneInfo localTimeZone = TimeZoneInfo.FindSystemTimeZoneById(localTZName);

tzName 是在moment.tz.guess()前端使用的结果。这种方法效果很好,但它相当于制作从一种风格到另一种风格的地图,所以我很高兴其他人经历了这种痛苦,所以我不必这样做。

这两种解决方案都很糟糕,但似乎没有办法解决它们

第一个解决方案依赖于希望时刻的字符串表示永远不会改变,并且时刻真的应该有一种方法来获取这个特定的数据,而不必从字符串中删除它,特别是因为他们已经经历了找到数据,他们就是不让你拥有它。

第二种解决方案只是蛮力映射。不优雅,丑陋,但它可以工作,虽然它真的感觉它应该是moment.tz.js或TimeZoneInfo,或者最好是两者都原生的东西。

这种脱节似乎来自这样一个事实,即 moment.js 拒绝承认 Windows 的存在,而 Windows 拒绝承认时区是复杂的野兽,具有许多可以影响准确约会的历史。

于 2019-04-02T18:50:10.860 回答