如何在使用bson.json_util时忽略时区.在python中加载



我正在转储和加载bson到文本文件和我的日期时间有时区信息添加到他们。我不希望添加时区信息。

import bson, datetime
d1 = datetime.datetime.now()
d2 = bson.json_util.loads(bson.json_util.dumps(d1))

结果d1:

datetime.datetime(2016, 8, 16, 14, 38, 41, 984544)

and d2:

datetime.datetime(2016, 8, 16, 14, 56, 10, 155000, tzinfo=<bson.tz_util.FixedOffset object at 0x1042ca050>)

在这里我可以输入

d3 = d2.replace(tzinfo=None)

删除时区。然而,我是在一个更大的对象中这样做的,在其他类型中,时间到处都是。是否有一种方法来指示bson.json_util.loads总是设置tzinfo=None时,它试图解析日期时间?

有意思。bson源直接覆盖object_hook,所以你不能传入一个自定义的。

来源:

def loads(s, *args, **kwargs):
    """Helper function that wraps :class:`json.loads`.
    Automatically passes the object_hook for BSON type conversion.
    """
    kwargs['object_hook'] = lambda dct: object_hook(dct)
    return json.loads(s, *args, **kwargs)

它们的源代码(在object_hook内部)也显式地设置了时区,这导致了您所看到的行为:

aware = datetime.datetime.strptime(
            dt, "%Y-%m-%dT%H:%M:%S.%f").replace(tzinfo=utc)
if not offset or offset == 'Z':
    # UTC
    return aware

我认为你将不得不对你的结果数据集做另一个传递来删除时区,如果你绝对不能有一个时区集。

EDIT:看起来有一个待定的更改,添加一个JsonOptions类,允许您通过tz_aware=False。因此,如果您可以等到python驱动程序更新到3.4,您应该能够获得所需的行为。

发现自己在2021年。我是这样解决的:

import bson, datetime
d1 = datetime.datetime.now()
json_options = json_util.DEFAULT_JSON_OPTIONS.with_options(tz_aware=False, tzinfo=None)
d2 = bson.json_util.loads(bson.json_util.dumps(d1), json_options=json_options)

相关内容

  • 没有找到相关文章

最新更新