javascript - 即使服务器/客户端位于同一时区,日期输入提要也是错误的

标签 javascript node.js meteor ecmascript-6

先决条件:

  1. 我的服务器和客户端计算机都有相同的时区,即印度标准时间(UTC +5:30)。

  2. 我在 CentOS 6.9 上使用 Meteor JS 1.5 + MongoDB 3.2

  3. 我已将 Linux 服务器 /etc/localtime/ 设置为 Asia/Kolkata,当我发出命令 date 时,它会在下面显示,

2017 年 7 月 12 日星期三 13:40:25 IST

操作:

下面是在服务器方法上运行的代码段,

History.insert({
  "time": new Date(),
});

由于代码在13:40PM IST运行,因此 mongoDb 中显示的日期条目如下,

> db.History.find({}).pretty();
{
        "_id" : "zFHFgBfGL2JxNR95N",
        "time" : ISODate("2017-07-12T08:10:10.175Z"),
        "result" : 1
}

问题:

为什么使用 Meteor JS 输入的日期与设置的时区不一样?为什么与机器(大约下午 13:40)不一样?

最佳答案

首先,IST 是 UTC +5:30,因此 13:40 IST 与 08:10 UTC 相同。

现在检查MongoDB docs关于日期类型:

Internally, Date objects are stored as a 64 bit integer representing the number of milliseconds since the Unix epoch (Jan 1, 1970)

请注意,时区根本没有被存储。

在同一个文档中进一步说明:

The mongo shell wraps objects of Date type with the ISODate helper; however, the objects remain of type Date.

这就是为什么您在 Mongo Shell 中查询时会看到返回 ISODate("2017-07-12T08:10:10.175Z")

如果切换到 Meteor Shell并查询您的数据,它将再次显示为 javascript 日期类型,并以您的服务器上定义的时区显示。

// try this in Meteor Shell
History.find({}).fetch()

如果您将此日期发送给客户,该日期将显示在其设备上定义的时区。

关于javascript - 即使服务器/客户端位于同一时区,日期输入提要也是错误的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45052267/

相关文章:

javascript - 当使用 Angular 2 进行 HTTP 调用失败并出现 404 错误时,如何构建占位符对象?

javascript - 从直接链接将 redux 项加载到状态

javascript - 优化数组的结果

javascript - NodeJS 异步库不会异步发送请求

meteor - 如何避免cursor.observe 上的竞争条件?

meteor - Momentjs 不更新时间 .fromNow()

javascript - 括号实时预览不会加载带有 HTML 和 CSS 文件的 Javascript

javascript - 使用 a+ 在 Node 中构造正确的 Promise

node.js - Node 请求添加 header

meteor - 后台任务未与 Meteor 中的任何客户端连接