【问题标题】:Moment JS fromnow() outputting shorthandMoment JS fromnow() 输出速记
【发布时间】:2016-07-23 19:40:42
【问题描述】:

我从服务器收到一个 UTC 日期时间,并试图以可读的形式显示它:

moment.utc(utc_date).local().fromNow();

在我的本地开发环境(Homestead、Laravel)中,这可以正常工作,并且会完全按照要求显示,例如:

a day ago

4 hours ago

但在我的生产服务器上,它输出的似乎是速记:

1d

4h

我似乎无法弄清楚这一点,而且我的搜索没有任何结果。我有什么明显的遗漏吗?或者关于如何解决它的任何建议?

【问题讨论】:

  • 我假设您的生产服务器上没有locales,或者您正在使用尚不存在的语言环境进行测试,因此它正在回退到 d/h。这可能是一个糟糕的假设,因为代码中有一个后备defaultRelativeTime,但TBH 你真的只需要在生产环境中的调试器中逐步完成你的代码。找出失败的地方应该不难。 (顺便说一句 - 我开始讨厌 es6 模块......这么多文件只是阻止它 - 这是矫枉过正 moment
  • utc_date 变量中实际存在什么类型的值?它是Date 对象吗?一个号码?一个字符串?请举个例子。此外,一般来说,fromNow 不会在意您切换到 utc 模式还是本地模式,因为无论如何“now”在内部都是基于 utc 的。
  • @MattJohnson 恕我直言,这是一个我们不应该关注的细节,正如您已经说过的那样。

标签: javascript momentjs


【解决方案1】:

为了获得您描述的那种输出,您必须自定义区域设置。 Moment 没有内置这种格式的语言环境。

其他人已经要求了,moment issue #2781 中有一个如何做到这一点的示例。也许您使用的库之一就是采用这种方法。

没有什么特定于机器的东西会改变你得到的结果,所以如果你说它在你的生产服务器上有所不同,那么我推测那个环境中要么有不同的代码,要么它正在执行不同的代码路径。

如果您需要明确清除对语言环境的自定义,您可以像这样还原它:

moment.updateLocale('en', null);

【讨论】:

  • 通过 npm 加载 Moment 应该意味着它会自动加载所有语言环境,对吧? Moment 将语言环境识别为“en”,经过大量刷新和测试后,它似乎在大约 10% 的时间内正确显示,其余时间显示为简写形式。
  • 可能您的链中的其他一些库正在全局修改 en 语言环境。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2017-07-07
  • 2016-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-09-03
相关资源
最近更新 更多