【发布时间】:2020-12-25 06:47:47
【问题描述】:
将 CST 日期和/或日期时间字段与 DST 感知设置一起转换为 UTC 并以 Python/PyMongo 中的 ISO 格式存储在 MongoDB 中的正确、理想或首选方法是什么?源日期/日期时间字段可以来自任何时区(现在我们知道它的 CST),我需要将它们全部转换为 UTC 并存储到目标 MongoDB。
根据 MongoDB 文档,MongoDB 默认以 UTC 存储时间,并将任何本地时间表示形式转换为这种形式。必须对某些未修改的本地时间值进行操作或报告的应用程序可以将时区与 UTC 时间戳一起存储,并在其应用程序逻辑中计算原始本地时间。
例子:
方法#1:使用时间戳(定义本地时区)
from datetime import datetime
import pytz
local_timezone = pytz.timezone("US/Central")
utc_datetime = local_timezone.localize(datetime.strptime ("1/2/2017 12:43 pm",'%m/%d/%Y %H:%M %p'),is_dst=True).astimezone(pytz.utc)
print(utc_datetime)
print(type(utc_datetime))
2017-01-02 18:43:00+00:00
<class 'datetime.datetime'>
没有时间戳,即只有日期: - 它在时间戳和 DST 5 小时期间添加 6 小时的偏移值。删除或不删除 astimezone(pytz.utc) ,它会返回日期/时间,如 2017-01-02 00:00:00-06:00 即显示 -6 小时偏移差异。我们真的应该使用 astimezeon(pytz.utc) 吗??
from datetime import datetime
import pytz
local_timezone = pytz.timezone("US/Central")
utc_datetime = local_timezone.localize(datetime.strptime ("1/2/2017",'%m/%d/%Y'),is_dst=True).astimezone(pytz.utc)
print(utc_datetime)
print(type(utc_datetime))
2017-01-02 06:00:00+00:00
<class 'datetime.datetime'>
方法#2:带时间戳(未定义本地时区)
from datetime import datetime, timezone
utc_datetime=datetime.utcfromtimestamp(datetime.strptime ("1/2/2017 12:43 pm",'%m/%d/%Y %H:%M %p').replace(tzinfo = timezone.utc).timestamp())
print(utc_datetime)
print(type(utc_datetime))
2017-01-02 12:43:00
<class 'datetime.datetime'>
没有时间戳,即只有日期部分 - 没有偏移
from datetime import datetime, timezone
utc_datetime=datetime.utcfromtimestamp(datetime.strptime ("1/2/2017",'%m/%d/%Y').replace(tzinfo = timezone.utc).timestamp())
print(utc_datetime)
print(type(utc_datetime))
2017-01-02 00:00:00
<class 'datetime.datetime'>
加载到 MongoDB 后 - 它会在日期/时间戳的末尾添加一个“Z”。启动与 MongoClient 的连接时是否还应添加“tz_aware=True”?
ISOFormat - 将 utc 时间戳更改为 isoformat() 返回并在 MongoDB 中作为字符串而不是日期加载。那么,我们如何确保它仍然以 ISO 日期格式存储在 MongoDB 中?
utc_datetime_iso=datetime.utcfromtimestamp(datetime.strptime ("1/2/2017",'%m/%d/%Y').replace(tzinfo = timezone.utc).timestamp()).**isoformat()**
print(utc_datetime_iso)
print(type(utc_datetime_iso))
2017-01-02T00:00:00
<class 'str'>
【问题讨论】:
-
将这些值插入 MongoDB 并检查实际插入的内容(最好使用 mongo shell 之类的本机工具)
-
我在上面也提到过,它在日期时间的末尾添加了一个“Z”,如下所示:2017-01-02 06:00:00Z,但它来自 robo3t mongodb UI 界面,haven '未从 Mongo 本机 shell/CLI 检查。我很想知道从本地时区处理 UTC 转换、存储到 MongoDB 的最佳和推荐做法是什么 - 格式和所有 - 以防万一这些数据要在全球范围内用于报告目的。
-
旁注:考虑不使用pytz和utcfromtimestamp。
-
那么,Python 中将本地时区转换为 UTC 的另一种选择是什么?在上述两种方法中,我使用 pytz 而不是 utcfromtimestamp,根据这两个链接:- [link] (julien.danjou.info/python-and-timezones) 和 [link] (medium.com/@jmarhee/…)。
标签: python-3.x mongodb utc python-datetime pymongo-3.x