mongodb的时间
mongodb存储的时间统一为ISODate
下面无论哪种形式,自重的结果都是ISODate
new Date("<YYYY-mm-ddTHH:MM:ss>") //指定本地时间创建ISODate
new Date("<YYYY-mm-ddTHH:MM:ssZ>") //指定utc时间创建ISODate
new Date(<integer>) // 指定timestamp,毫秒为单位,生成ISODate
pymongo
pymongo使用datetime.datetime类型表示mongodb中存储的时间
不带时区信息的datetime
对于一个不带时区信息的datetime,pymongo直接发给mongdb,当作utc时间存储
from datetime import datetime
db.testtable.insert_one(
{"a": datetime.utcnow(), "b": datetime.now()})
得到的结果如下
> db.testtable.find()
[
{
_id: ObjectId("6360c3d0ea460828d7307520"),
a: ISODate("2022-11-01T06:59:28.257Z"),
b: ISODate("2022-11-01T14:59:28.257Z")
}
]
可以看到datetime的值,未做任何处理,直接当作IOSDate存进mongodb
带时区信息的datetime
看例子:
import pytz
dtime = pytz.timezone('Asia/Shanghai').localize(datetime.now()) #给datetime指定时区
db.testtable.insert_one(
{"a": datetime.utcnow(), "b": dtime})
得到的结果如下:
> db.testtable.find()
[
{
_id: ObjectId("6360c63c904ab09e08165340"),
a: ISODate("2022-11-01T07:09:48.255Z"),
b: ISODate("2022-11-01T07:09:48.255Z")
}
]
可以看到上面例子中的dtime,指定了时区,存储时自动被pymongo转为UTC时间,存到mongodb
从mongo中读取时间字段
默认pymongo读到时间字段,直接转为datetime.datetime对象,不考虑任何时区信息, eg:
data = db.testtable.find_one()
print(repr(data['a']))
结果如下:
% python example.py
datetime.datetime(2022, 11, 1, 7, 9, 48, 255000)
可以看到从mongodb中取出的时间原样转为datetime, 不带任何时区信息(当作本地时区处理)
pymongo可以通过指定tz_aware option,反应时区信息, eg:
from bson.codec_options import CodecOptions
tztable = db.testtable.with_options(codec_options=CodecOptions(
tz_aware=True,
tzinfo=pytz.timezone('Asia/Shanghai')))
data = tztable.find_one()
print(repr(data['a']))
结果如下:
% python example.py
datetime.datetime(2022, 11, 1, 15, 9, 48, 255000, tzinfo=<DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD>)
可以看到pymonogo自动把原始的utc时间转为option中的tzinfo指定时区的时间
留意,如果不指定tzinfo,只指定tz_aware, 默认使用utc时区