【问题标题】:Moment JS gives incorrect time in NodejsMoment JS 在 Nodejs 中给出了不正确的时间
【发布时间】:2020-03-06 18:06:03
【问题描述】:

我在 Nodejs 中使用moment.js 来获取当前日期和时间。我得到的日期部分是正确的,但时间差了 4 小时。例如,密歇根的时间是下午 1:03,但现在是下午 6:00

我正在将这个时间插入数据库并获取当前时间,我正在这样做:

moment()

【问题讨论】:

  • 密歇根在哪个时区?
  • 密歇根州以外的人可以使用该网站。我不想将时区设置为密歇根
  • @namko 数据保存到数据库后最终将如何使用?在浏览器中?还是一些面向用户的产品?还是通过另一台服务器?答案会改变你的解决方案。

标签: javascript node.js momentjs


【解决方案1】:

可扩展性问题:

首先让我们指出,您不应该将本地时间保存到数据库中。你的数据库应该有尽可能少的偏差,即不应该绑定到本地时区。为什么?好吧,当您扩展解决方案并部署到 AWS 等云服务时,您必须在多个托管区域中实例化多个服务器,这些服务器存在于全球不同位置,您的数据库将立即处于非常糟糕的状态,并且正在节省时间以非确定性的方式,从而给你许多未来的错误来杀死。

解决方案

首先将 UTC 时间保存到您的数据库中moment.utc() || new Date()。然后在前端(假设你有一个),用户的浏览器有一个本地化的时区结块到它的运行时。因此,您可以使用多种选项来管理用户应用程序的使用情况。

解决方案选项

  1. 在您的前端代码中,moment().format('hh:mm') 将是浏览器/手机/设备设置的本地时区,无论使用数据库数据。

  2. 如果您从 1 中给出相同的算法,即 DB UTC 时间 moment(<time from db as UTC>).format('hh:mm'),您将只能看到格式化的 UTC 时间。

  3. 现在,如果您希望数据库时间 (UTC) 以本地时间的形式显示给您各自的用户,您可以执行 moment(val).utcOffset('-0400').format('hh:mm')

主要的收获是,您需要从解决方案中消除服务器时间偏差。否则你会遇到非常糟糕的问题。如果您的数据库中的时间将被面向用户的应用程序消耗,那么您需要在解决方案中考虑浏览器时间偏差。

注意: .format() 方法有很多配置。我选择hh:mm 只是为了直观的示例。这显然应该根据您的需要进行更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多