MongoDB默认是以 UTC 格式存储时间和日期的,跟本地的时间是有时差的,一般保存的时候会将本地时间转为 UTC 时间再保存。那读取的时候也需要每次都手动转为本地时间吗?
解决方法
其实不需要。MongoClient对象初始化的时候,支持tz_aware参数。当tz_aware为True的时候,读取出来的时间是会自动转为本地时间的,这个特性是由BSON编解码器提供的,tz_aware参数最终会传递到CodecOptions里,供BSON编码解码器在编解码的时候使用。
注意事项
tz_aware需要跟tzinfo参数搭配使用。当tz_aware为True的时候,需要指定tzinfo。1
2
3
4
5
6import pytz
client = MongoClient(tz_aware=True, tzinfo=pytz.timezone('Asia/Shanghai')
# 或者
# from flask_pymongo import PyMongo
# client = PyMongo(app, tz_aware=True, tzinfo=pytz.timmezone('Asia//Shanghai'))当使用
tz_aware自动转换时间的情况下,转换出来的时间对象是带有时区信息的,不能直接跟本地时间进行加减,需要先去掉时区信息。1
2def remove_timezone(dt: datetime) -> datetime:
return dt.replace(tzinfo=None)