在python中使用bson.json_util.loads时如何忽略时区?

时间:2016-08-16 22:51:12

标签: python datetime timezone pymongo bson

我将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)

和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

1 个答案:

答案 0 :(得分:1)

有趣。 bson来源会直接覆盖object_hook,因此您无法传递自定义内容。

来自source here

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

如果您绝对无法设置时区,我认为您将不得不对结果数据集进行另一次传递以删除时区。

编辑:看起来有一个pending change来添加JsonOptions类,可以让您通过tz_aware=False。因此,如果您可以等到python驱动程序更新到3.4,那么您应该能够获得所需的行为。