【问题标题】:moment.js parse date in language and timezonemoment.js 以语言和时区解析日期
【发布时间】:2017-08-19 09:35:53
【问题描述】:

我想将不同时区的日期转换为字符串 ISO 日期。

有效的方法:使用时区即时解析非本地化日期:

var sdate = "2016-12-13 09:45:46"
var m = moment.tz(sdate, "Europe/Amsterdam");
var iso = m.toISOString();
console.log(iso);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data.js"></script>

但是当我有一个用德语(“de”语言环境)的日期时, 有时区,那我什么都做不了。

var sDateRaw = "16. Aug. 2017 12:21"
var m = moment.utc(sDateRaw, "DD. MMM. YYYY hh:mm", "de");
var iso = m.toISOString();
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data.js"></script>

在第二种情况下,我需要提供“de”语言环境,因为月份 字符串需要语言环境。 (某些月份名称无法使用“en”语言环境解析)。

字符串日期位于“欧洲/阿姆斯特丹”时区。 但是在解析例程中,我无法设置字符串日期所在的时区。

如果我想要相同的结果,与机器所在的位置无关; 我必须使用 utc 来解析它。

似乎那一刻缺少同时解析带有语言环境和时区的日期的选项。

旁注:因为 moment 是单例; (所有需要(“时刻”)都得到 返回同一个对象),我不想立即设置语言环境或时区, 因为这会影响应用程序的其他部分 没有任何控制权(许多图书馆使用时刻)

所以要解决我的问题,我只能看到解决方案,现在打印日期 作为iso字符串,然后解析iso字符串并提供时区。

但是进行两次日期解析,这对我来说真的没有意义。

【问题讨论】:

  • moment.js 默认只支持英文(使用moment.locales),如果你想支持,你需要导入其他语言。抱歉,语言代码被称为“语言环境”有点麻烦。语言环境是一个小的地理区域或地方。语言很少局限于这么小的区域,除了通常不在网络上使用的部落语言。
  • 嗨,罗伯!我的第二个示例使用“de”语言环境。语言环境在 moment.js 中确实有效。这不是问题。问题真的是,我无法解析带有时区的语言环境中的日期。现在,我可以解析德国日期语言环境,并指定美国东部时区。我为什么要这样做?因为我在多台机器上运行代码,这些机器位于不同时区的数据中心。

标签: javascript date datetime momentjs


【解决方案1】:

“区域设置”仅在您使用带有区域设置的时刻时才有效。 moment.js 文档很差,因为它非常简短,并且将术语“语言环境”与“语言”混淆了。

解析字符串时,应该通过:

  1. 要解析的字符串
  2. 格式和可选
  3. 使用 ISO 639 语言代码的字符串语言。

这第三个参数在文档中称为“locale”,但它实际上是一种语言,不应与“locale”在日期、时间、时区和格式方面的其他用途(通常不合适)混淆。

“区域”一词是指一个小的地理区域,例如郊区或村庄。它通常与像非洲/开罗这样的 tz 时区指示符相关联,这实际上是一个地区或地区。它在定义日期格式和在 moment.js 文档中被误用为表示语言(有时)。

无论如何,如果你想解析不同语言的字符串,请使用带有 locales(语言)的 moment.js。

例如与 moment-with-locales.min.js:

var sDateRaw = "16. Aug. 2017 12:21"
var m = moment.utc(sDateRaw, "DD. MMM. YYYY hh:mm", "de");
var iso = m.toISOString();
console.log(iso);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.13/moment-timezone-with-data.js"></script>

要在多个位置使用时间,请将所有内容保持为 UTC,并且仅使用本地时间进行显示。

【讨论】:

  • 我正在解析从网站收到的日期;该网站以他们自己的当地时间显示日期。他们还以“de”语言环境输出格式。我确实认为这是 moment.js 缺少的功能。我不可能是这个世界上唯一需要同时使用不同语言格式和不同时区的人。
  • @awb99—“de”既不是格式也不是语言环境,它是一种语言。如果时间在德国观察到的时区,则时区偏移量将为中欧时间 (CET) 的 +0100 或中欧夏令时间 (CEST) 的 +0200,具体取决于日期和时间。如果您希望使用区域设置来确定要应用的时区,请使用像 Europe/Berlin 这样的指示符(或任何其他合适的指示符,用于与 moment-timezone.js 支持的具有相同时区的地方)。
猜你喜欢
  • 2019-03-31
  • 1970-01-01
  • 2017-04-04
  • 2017-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
相关资源
最近更新 更多