【问题标题】:Date field in MongoDB shifted one hour when istanbul is used使用伊斯坦布尔时,MongoDB 中的日期字段偏移一小时
【发布时间】:2018-10-18 06:23:13
【问题描述】:

我正在使用 mongoose 和以下 ConfigItem 架构:

var ConfigItem = new Schema({   
  name: {
    type: String,
    required: true
  },
  value: {
    type: String,
    required: false
  },
  date: {
    type: Date,
    required: false
  },
  user: {
    type: String,
    required: false
  }
});

接下来,我有一个根据这个架构保存文档的功能:

function createConfigItem(_name, _value, _date, _user, callback) {
    var config = new ConfigItems({
        name: _name,
        value: _value,
        date: _date,
        user: _user
    });
    config.save(function handleSaveConfig(err) {
        if(callback){
            callback(err);
        }
    });
}

接下来,我有一个单元测试(基于 mocha),它以下列方式使用该函数:

createConfigItem('sftpHost', '1.1.1.1', '2018-03-15 10:06:40.713', 'user1', callback);

如果我在 mocha 下运行测试(见注 1),我会在 MongoDB 上得到以下结果:

> db.configitems.find()
{ "_id" : ObjectId("5af173b1f155a4bff29f3e35"), "name" : "sftpHost", "value" : "1.1.1.1", "date" : ISODate("2018-03-15T10:06:40.713Z"), "user" : "user1", "__v" : 0 }

这是我所期望的。

但是,如果我通过 grunt 使用istanbul 运行(请参阅注 2)以获取覆盖率报告,则对 createConfigItem() 的相同调用会在 DB 中创建以下文档:

> db.configitems.find()
{ "_id" : ObjectId("5af176cbcffb8cc20a1fe3c2"), "name" : "sftpHost", "value" : "1.1.1.1", "date" : ISODate("2018-03-15T09:06:40.713Z"), "user" : "user1", "__v" : 0 }

请注意,在这种情况下,DB 中的 date 字段相对于 _date 字符串参数偏移一小时。

我认为它可能与时区有某种关联,但我已确保我的进程在 UTC 设置 process.env.TZ = 'UTC' 下运行。

我有点迷失了......关于日期和/或时区的猫鼬/咕噜声/伊斯坦布尔是否有任何已知问题?请问有关于这个问题的提示吗?

注1:使用的命令:

/home/fermin/.nvm/versions/node/v6.12.3/bin/node --debug-brk=50806 --expose_debug_as=v8debug /home/fermin/src/ctxmboard/node_modules/mocha/bin/_mocha --timeout 0 --ui bdd --reporter /home/fermin/.PyCharm2018.1/config/plugins/NodeJS/js/mocha-intellij/lib/mochaIntellijReporter.js --recursive /home/fermin/src/ctxmboard/test/back/unit

注2:使用的命令:

/home/fermin/.nvm/versions/node/v6.12.3/bin/node --debug-brk=33002 --expose_debug_as=v8debug ./node_modules/.bin/istanbul cover --root lib/ --dir site/coverage -- /home/fermin/.nvm/versions/node/v6.12.3/lib/node_modules/grunt-cli/bin/grunt test

【问题讨论】:

  • 从逻辑上讲,我认为解决这个问题的方法是以有效的 ISO 格式为 UTC '2018-03-15T10:06:40.713Z' 提供“字符串”。它可能使用 momentjs 来解析,但回退应该始终是纯 JavaScript Date(),这当然会对 ISO 字符串感到满意。不要留下任何误解的余地,应该没问题。
  • 解决了这个问题。谢谢! :)

标签: node.js mongoose gruntjs istanbul


【解决方案1】:

你可以使用moment节点模块https://momentjs.com/docs/

var date=moment.utc().toDate();

【讨论】:

    【解决方案2】:

    正如问题 cmets 中的建议,使用严格的 ISO8601 格式,正在更改

    '2018-03-15 10:06:40.713'
    

    通过

    '2018-03-15T10:06:40.713Z'
    

    解决了问题

    【讨论】:

      猜你喜欢
      • 2023-03-11
      • 2018-06-01
      • 2016-04-05
      • 2016-11-13
      • 2016-11-16
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      相关资源
      最近更新 更多