MongoDB查询时ISODate被转本地时区问题咨询
解决MongoDB查询时时间戳显示为本地时区的问题
别担心,这不是你的查询方式或者forEach方法的问题,本质是Mongo Shell的默认显示行为在搞鬼!
为什么会出现这个情况?
MongoDB里存储的ISODate本质是UTC时间,当你用print()输出这个日期对象时,Mongo Shell会自动把它转换成你当前终端的本地时区(也就是你提到的GMT+0530 IST)的字符串格式,但数据库里存储的原始UTC时间并没有被修改,只是显示形式变了。
如何输出原始插入的ISO格式时间戳?
你可以通过以下几种方式来获取原始的ISO格式时间:
使用
toISOString()方法:直接调用日期对象的这个方法,就能输出和插入时一致的UTC格式字符串:db.SBIN.find({'timestamp': ISODate('2020-03-09T09:25:05Z')}).forEach(function(x) { print(x.timestamp.toISOString(), x.last_price) })执行后你会看到输出
2020-03-09T09:25:05Z,和你插入的原始时间完全一致。验证时间戳的原始值:如果想确认数据本身没被改动,可以获取日期的时间戳(毫秒数),这个值是UTC统一的,不会受时区影响:
db.SBIN.find({'timestamp': ISODate('2020-03-09T09:25:05Z')}).forEach(function(x) { print(x.timestamp.getTime(), x.last_price) })这个时间戳对应的值是
1583743505000,不管在哪个时区查询,这个数值都是固定不变的。用
JSON.stringify()输出完整文档:如果需要查看整个文档的原始格式,用这个方法可以把日期序列化为ISO格式的字符串:db.SBIN.find({'timestamp': ISODate('2020-03-09T09:25:05Z')}).forEach(function(x) { print(JSON.stringify(x)) })输出的文档里,
timestamp会显示为"2020-03-09T09:25:05.000Z",这就是数据库存储的原始格式。
内容的提问来源于stack exchange,提问作者slayedbylucifer
相关产品推荐
相关产品推荐

