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

Posted

技术标签:

【中文标题】在 python 中使用 bson.json_util.loads 时如何忽略时区?【英文标题】:How to ignore timezone when using bson.json_util.loads in python? 【发布时间】:2016-12-23 11:07:39 【问题描述】:

我正在将 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】:

有趣。 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,你应该能够得到你想要的行为。

【讨论】:

【参考方案2】:

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)

【讨论】:

这会抛出这个错误:Traceback(最近一次调用最后一次):json_options = json_util.DEFAULT_JSON_OPTIONS.with_options(tz_aware=False, tzinfo=None) File "/usr/local/lib/python2.7/ dist-packages/bson/json_util.py”,第 410 行,在负载中返回 json.loads(s, *args, **kwargs) 文件“/usr/lib/python2.7/json/__init__.py”,第 352 行, 在加载中返回 cls(encoding=encoding, **kw).decode(s) File "/usr/lib/python2.7/json/decoder.py", line 357, in init self .scan_once =scanner.make_scanner(self) TypeError: encoding must be a string, not CodecOptions @ReaHaas 我刚刚在我的机器上运行了它,它可以工作。你用的是哪个版本?

以上是关于在 python 中使用 bson.json_util.loads 时如何忽略时区?的主要内容,如果未能解决你的问题,请参考以下文章

在 python 中使用 soffice,Command 在终端中有效,但在 Python 子进程中无效

python 使用pymongo在python中使用MongoDB的示例

在 python 中使用命令行时出现语法错误

python 在python中使用全局变量

如何在 Python 3.x 和 Python 2.x 中使用 pip

在Python中使用Redis