昨天,我在MongoDB上有过一些奇怪的经历。我使用的是三叶草 -- mongodb的异步驱动程序(类似于pymongo)。
我有一个rest服务,它接收一些数据并将其放到mongodb中。一个字段是时间戳,以毫秒为单位,13位。
首先,在python中将毫秒时间戳转换为python的方法并不简单。最后我得到了这样的结果:
def date2ts(ts):
return int((time.mktime(ts.timetuple()) * 1000) + (ts.microsecond / 1000))
def ts2date(ts):
return datetime.datetime.fromtimestamp(ts / 1000) + datetime.timedelta(microseconds=(ts % 1000))问题是,当我将数据保存到mongodb时,使用函数将日期时间回退并将其转换回时间戳,结果不会在毫秒内得到相同的结果。
我不明白为什么会发生这种事。Datetime作为ISODate对象保存在mongodb中。我试着从shell中查询它,在一秒或几毫秒内确实存在差异。
问题1:有人知道为什么会这样吗?
但这事还没完。我决定不使用日期时间,而是直接保存时间戳。在此之前,我从集合中删除了所有数据。我很惊讶,当我试图保存相同的字段时,不是作为日期,而是保存的时间一样长,它在shell中被表示为ISODate。当检索到时,在几毫秒内仍然存在差异。
我试着删除集合和索引。当它不起作用时,我试着删除整个数据库。当它不起作用时,我试图删除整个数据库,并重新启动mongod。在这之后,我想它开始把它保存很久了。
问题2:有人知道为什么会这样吗?
谢谢!
发布于 2012-06-16 23:52:24
自1970年1月1日的Unix时代以来,Python的时间戳以秒计算。另一方面,JavaScript (以及MongoDB)中的时间戳是以毫秒为单位的。
也就是说,如果您手头只有时间戳,您可以将Python值乘以1000,以获得毫秒,并将该值存储到MongoDB中。同样,您可以从MongoDB获取值,并将其除以1000,使其成为Python时间戳。请记住,Python似乎只关心小数点之后的两个重要数字,而不是三个(因为它通常不关心毫秒),所以如果仍然存在< 10毫秒的差异,请记住这一点。
通常,我建议使用元组,但是对于每种语言来说,值范围的约定是不同的(JavaScript是不直观的,因为它从每月的0开始,而不是1),并且可能会导致问题的发生。
发布于 2012-06-28 09:31:10
它可以是不同时区的情况。请使用下面提到的功能来纠正它。
function time_format(d, offset) {
// Set timezone
utc = d.getTime() + (d.getTimezoneOffset() * 60000);
nd = new Date(utc + (3600000*offset));
return nd;
}
searchdate = time_format(searchdate, '+5.5');这里是从当地时间到格林尼治时间的时区差。
https://stackoverflow.com/questions/11031745
复制相似问题