如何从时刻对象获取“标准”时区字符串?

时间:2019-04-01 22:01:26

标签: javascript asp.net momentjs moment-timezone

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

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

SampleData

我需要使用“ Pacific Daylight Time”部分,因为那是TimeZoneInfo c#类(我在后端使用的)唯一接受的字符串格式。

如何获取该数据?

我已经阅读了文档和指南,与时区的“标准”名称没有任何关系,仅与诸如“美国/洛杉矶”之类的基于城市的时区名称无关。我可以制作一个将城市名称映射到标准名称的字典,但这会花费相当长的时间,而且很痛苦,所以我想找到适当的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

使用字符串解析或C#库

我找到了2种解决方案,可以为我提供所需的数据,但是它们都非常糟糕而且很笨拙。

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

可以使用正则表达式或.split()完成此操作,并且它假定日期字符串的格式从不改变。它看起来像:

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

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

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

我发现的两个库是TimeZoneNamesTimeZoneConverter。这些可以采用IANA样式的名称,并将其与Windows标准的等效名称匹配。我像这样使用TimeZoneConverter:

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

tzName是在前端使用moment.tz.guess()的结果。这种方法效果很好,但是它相当于将地图从一种样式转换为另一种样式的预先构建好的方法,因此我很高兴其他人经历了这种痛苦,因此我不必这样做。

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

第一个解决方案依赖于此刻的字符串表示形式永不改变的希望,而moment确实应该有一种方法来获取此特定数据片段而不必将其切出字符串,尤其是由于已经遇到了寻找数据的麻烦,他们只是不允许您拥有它。

第二种解决方案只是蛮力映射。尽管看起来确实应该是moment.tz.js或TimeZoneInfo,或者最好是两者都应具有的本领,但它虽然雅致,丑陋,但确实有效。

断开连接似乎来自以下事实:moment.js拒绝承认Windows存在,而Windows拒绝承认时区是具有许多可影响准确约会的历史的复杂野兽。