Python MongoDB日期和删除的对象

Python MongoDB日期和删除的对象,python,mongodb,datetime,twisted,pymongo,Python,Mongodb,Datetime,Twisted,Pymongo,昨天我和MongoDB有了一些奇怪的经历。我正在使用twisted and-mongodb的异步驱动程序(类似于pymongo) 我有一个rest服务,它接收一些数据并将其放入mongodb。一个字段是以毫秒为单位的时间戳,13位数字 首先,在python中,将毫秒时间戳转换为python日期时间并非易事。我的结局是这样的: def date2ts(ts): return int((time.mktime(ts.timetuple()) * 1000) + (ts.microsecond

昨天我和MongoDB有了一些奇怪的经历。我正在使用twisted and-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并使用我的函数将其转换回时间戳时,我不会在毫秒内得到相同的结果

我不明白为什么会这样。Datetime作为ISODate对象保存在mongodb中。我试图从shell中查询它,在一秒钟或几毫秒内确实存在差异

问题1:有人知道为什么会发生这种情况吗?

但这还没有结束。我决定不使用datetime,而是直接将时间戳保存得尽可能长。在此之前,我从收集中删除了所有数据。我很惊讶,当我试图保存同一个字段时,它在shell中表示为ISODate,而不是date。当检索到时,在几毫秒内仍然存在差异

我试图删除集合和索引。当它不起作用时,我试图删除整个数据库。当它不起作用时,我尝试删除整个数据库并重新启动mongod。在这之后,我想它开始把它保存得更久

问题2:有人知道为什么会发生这种情况吗?


谢谢大家!

自1970年1月1日Unix时代以来,Python的时间戳是以秒计算的。另一方面,JavaScript(以及MongoDB)中的时间戳是以毫秒为单位的

也就是说,如果您手头只有时间戳,那么可以将Python值乘以1000以获得毫秒数,并将该值存储到MongoDB中。同样,您可以从MongoDB中获取值并将其除以1000,使其成为Python时间戳。请记住,Python似乎只关心小数点后的两个有效数字,而不是三个(因为它通常不关心毫秒),因此如果仍然存在<10毫秒的差异,请记住这一点


通常我会建议改为使用元组,但每种语言的值范围约定不同(JavaScript不直观,因为它从一个月的0天开始,而不是1天),可能会导致问题。

可能是不同时区的情况。请使用下面提到的功能进行校正

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');

“+5.5”这里是本地时间与格林尼治时间之间的时区差。

我需要以毫秒为单位进行存储,以便按时间戳字段进行精确查询。我认为最简单的方法是将时间戳存储得尽可能长。“Python的时间戳是以秒为单位计算的”datetime有一个微秒字段,实际上可以存储毫秒时间戳。我猜txmongo驱动程序做得不对。找到了这个注释:datetime.datetime实例将四舍五入到最接近的毫秒,当savedLet采用不同的方法时:您到底想实现什么?您能解释一下“按时间戳字段进行精确查询”的含义吗?有了这些信息,我们可以帮助您得到一个不会出现舍入错误的答案。我的意思是,我通过创建日期(和作者id)来识别某个对象。创建日期必须以毫秒为单位,这样我可以或多或少自信地进行如下查询:
db.content.remove({“author\u id”:author\u id,“Creation\u date”:ts})
,并且我希望能够对相同的
Creation\u date
字段进行日期查询,如
db.content.find({“Creation\u date”:{$gt:start,$lt:end})
Hi。这是可能的。但我认为事实并非如此。因为mongo和app在同一台服务器上,差异在几秒钟甚至几分钟之内。看起来这是一个感知问题。