2016-08-16 62 views
1

我正在將bson轉儲並加載到文本文件中,並且我的日期時間中添加了時區信息。我不想添加時區信息。如何在python中使用bson.json_util.loads時忽略時區?

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,你應該能夠得到你想要的行爲。

相關問題