【问题标题】:Why does ISO date in Mongodb display one day earlier?为什么MongoDB中的ISO日期显示提前一天?
【发布时间】:2021-11-22 04:59:18
【问题描述】:

存储的日期如下所示:

...
"date_of_birth" : ISODate("1920-01-02T00:00:00Z"),
...

使用moment,它在模型中被格式化(为了填充更新文档的输入),如下所示:

   AuthorSchema
   .virtual('date_of_birth_update_format')
   .get(function(){
      // format in JavaScript date format (YYYY-MM-DD) to display in input type="date"
      return this.date_of_birth ? moment(this.date_of_birth).format('YYYY-MM-DD') : '';
   });

从集合中检索并显示,它显示为一天前,如下所示:

01/01/1920

如果能帮助解决这个问题,我将不胜感激。

【问题讨论】:

  • 你的时区是什么时候?您可能需要使用moment-timezone 模块

标签: javascript node.js mongodb mongoose mongoose-schema


【解决方案1】:

来自 mongo 的日期始终为 GMT,而您的服务器可能位于其他时区。您需要在格式化之前将日期转换为 GMT。

var moment = require("moment-timezone")

AuthorSchema.virtual('date_of_birth_update_format').get(function(){
 return this.date_of_birth ? moment(this.date_of_birth).tz('GMT').format('YYYY-MM-DD') : '';
});

【讨论】:

  • 谢谢。既然 moment 持有 require('moment'),你是说 moment-timezone 取代了 moment?
  • 时刻-时区扩展时刻。所以你可以用时刻时区替换时刻使​​用。您将获得所有时刻的功能
  • 谢谢。我按照您的建议安装了时刻时区并修改了我的代码,除了我像这样将“America/New_York”传递给 tz .tz(“America/New_York”)。不幸的是,它仍然显示 1 月 1 日而不是 1 月 2 日,因为它在数据库中。
  • 更新。我完全按照您的建议通过了“GMT”,现在它显示为 1 月 2 日!太棒了!
  • 这是一个处理出生日期的奇怪案例,您是否可以使用 GMT 时区(因为时间无关紧要)。对于其他用例,您需要根据需要使用适当的时区
【解决方案2】:

ISO 8601 格式中的Z 表示“GMT”,即1920-01-02T00:00:00+0000。 Moment 将考虑您的时区。如果您在美国大陆,您的时区偏移量为-0400—-0800。

1920-01-02T00:00:00Z = 1920-01-01T6:00:00-0600 以太平洋标准时间为例。

【讨论】:

  • 谢谢。你是说我需要修改数据保存到MongoDB的方式来反映美国纽约时间?
  • 从某种意义上说。如果您想表示 1920 年 1 月 2 日在纽约的一天的开始,那么是的,那就是 1920-01-02T00:00:00-0500。这似乎是您存储的生日,所以如果您想获得非常专业的技术,您可以使用出生地的时区偏移量。
【解决方案3】:

这取决于您所在的时区,例如我在印度,所以 GMT 对我来说是 +5:30,所以每当我从 db 检索时,我会将 5:30 加到时间上,以便它与日期匹配并回答为什么它会在前一天存储它,因为它以 ISO 格式存储日期,这就是原因

【讨论】:

    【解决方案4】:

    同样的问题。我使用 EJS 来显示从 MongoDB 数据库中检索到的日期。我不确定问题是否出在 EJS 上,但我是这样解决的:

    我所要做的就是在前端将 timeZone 设置为 GMT:

    date.toLocaleString("pt-BR", {timeZone:"GMT", day: "numeric", month: "numeric", year:"numeric"});
    

    【讨论】:

      猜你喜欢
      • 2021-03-22
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 2020-04-10
      相关资源
      最近更新 更多