mongodb的时间字段python版

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时区

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容