【问题标题】:How Should I Store/Display My Date/Time Field?我应该如何存储/显示我的日期/时间字段?
【发布时间】:2019-01-22 20:23:52
【问题描述】:

我知道有很多关于日期/时间存储和格式的问题,但我很难找到正确的方法。我的应用程序是一个 Node.js 应用程序,它使用带有 MongoDB 后端的猫鼬 Express。我正在使用 moment.js 来格式化我的日期/时间。

有问题的架构如下所示:

const stateSchema = new mongoose.Schema({
  changed: {
    type: Date,
    default: new Date()
  }
});

基于docs,我希望日期默认以 UTC 格式存储,但我看到的是:

changed: 2018-08-15 17:26:14.499

我用类似 (pug) 的东西显示日期/时间:

p= `Changed: ${moment(state.changed).format('MMMM Do YYYY, h:mm:ss a')}`

在 localhost 上,应用程序显示“2018 年 8 月 15 日,下午 5:26:14”,但在托管的 Heroku 应用程序上,我得到“2018 年 8 月 15 日,晚上 10:26:14”。我期待“2018 年 8 月 15 日,下午 5:26:14”,因为我在同一时区打开 Heroku 应用程序,但看起来它给了我服务器时区。

我应该怎么做才能确保日期/时间显示在客户的本地时区中?

【问题讨论】:

  • 在您提供的文档中写到,您也可以保存偏移量,然后相应地转换为您的本地时间。
  • 除非我读错了,否则该文档说日期存储为 UTC 并默认显示在客户端本地时区,如果你想在原始时显示它,你只需要 getTimezoneOffset()时区,我没有。我错过了什么?
  • 这里发生的是服务器端渲染,因为整个 HTML 是在服务器上创建的,然后发送到浏览器(客户端)。您必须借助脚本获取客户端的时区,然后将 UTC 转换为该时区。
  • 有道理。那么如何在 Node.js 应用程序中获取客户端的时区?

标签: node.js mongodb mongoose momentjs


【解决方案1】:

我想这就是答案。它给了我错误的本地主机时间,但应该是托管应用程序上的正确时间,无论我在哪里。

向架构添加偏移量:

const stateSchema = new mongoose.Schema({
  changed: {
    type: Date,
    default: new Date()
  },
  offset: {
    type: Number,
    default: new Date().getTimezoneOffset()
  }
});

然后在显示时减去偏移量:

p= `Changed: ${h.moment(state.changed.getTime() - (state.offset * 60000)).format('MMMM Do YYYY, h:mm:ss a')}`

【讨论】:

    猜你喜欢
    • 2014-12-11
    • 2011-10-26
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多