解决PyMongo时区问题

MongoDB默认是以 UTC 格式存储时间和日期的,跟本地的时间是有时差的,一般保存的时候会将本地时间转为 UTC 时间再保存。那读取的时候也需要每次都手动转为本地时间吗?

解决方法

其实不需要。MongoClient对象初始化的时候,支持tz_aware参数。当tz_awareTrue的时候,读取出来的时间是会自动转为本地时间的,这个特性是由BSON编解码器提供的,tz_aware参数最终会传递到CodecOptions里,供BSON编码解码器在编解码的时候使用。

注意事项

  1. tz_aware需要跟tzinfo参数搭配使用。当tz_awareTrue的时候,需要指定tzinfo

    1
    2
    3
    4
    5
    6
    import 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'))
  2. 当使用tz_aware自动转换时间的情况下,转换出来的时间对象是带有时区信息的,不能直接跟本地时间进行加减,需要先去掉时区信息。

    1
    2
    def remove_timezone(dt: datetime) -> datetime:
    return dt.replace(tzinfo=None)