我正在尝试通过python将时间字符串本地化为
Asia/Taipei
时区,并将数据保存到mongo。
但是当我尝试通过
localize
函数本地化时间时,出现以下错误:OverflowError: date value out of range
,我认为这可能是因为我尝试设置的时间是最大限制:9999/12/31
,因为当我设置其他时像 2024/01/01
这样的时间字符串它工作得很好。
所以我尝试通过
.replace(tzinfo=tz)
函数设置时间,但得到了错误的时区结果,因为 UTC +08:06
不是正确的 +08:00
。
目前我应用了方法3,替换时区后在日期时间上添加6分钟,但我不确定这是否是一个好方法。
您对将时间设置为正确的时区有什么建议吗?欢迎任何建议,以下是我的代码:
import pytz
from datetime import datetime, date
tz = pytz.timezone('Asia/Taipei')
date_string = '9999/12/31'
# method 1
# date_localized = datetime.strptime(date_string, '%Y/%m/%d')
# date_localized = tz.localize(date_localized)
# OverflowError: date value out of range
# method 2
date_localized = datetime.strptime(date_string, '%Y/%m/%d').replace(tzinfo=tz)
# 9999-12-30T15:54:00.000+00:00 in mongo
# method 3
date_localized = datetime.strptime(date_string, '%Y/%m/%d').replace(tzinfo=tz)
tag_disableDtm = tag_disableDtm + timedelta(minutes=6)
# 9999-12-30T16:00:00.000+00:00 in mongo
从 Python 3.9 开始,PyTZ 已被弃用。使用标准库中的
zoneinfo
来代替:
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
tz = ZoneInfo('Asia/Taipei')
date_string = '9999/12/31'
# method 2
date_localized = datetime.strptime(date_string, '%Y/%m/%d').replace(tzinfo=tz)
# datetime.datetime(9999, 12, 31, 0, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Taipei'))
# 9999-12-30T16:00:00.000+00:00 in MongoDB
date_localized.astimezone(timezone.utc)
# datetime.datetime(9999, 12, 30, 16, 0, tzinfo=datetime.timezone.utc)
此外,我建议您将 High Date 9999-12-31 存储为 UTC 并存储在 午夜。否则,来自不同位置的本地化转换在 12 月 30 日或 31 日始终会出现不同的时间,从而导致数据库中同一日期的时间不同。
HIGH_DATE = datetime(9999, 12, 31, tzinfo=timezone.utc)
HIGH_DATE.astimezone(ZoneInfo('Asia/Taipei'))
# datetime.datetime(9999, 12, 31, 8, 0, tzinfo=zoneinfo.ZoneInfo(key='Asia/Taipei'))
# 9999-12-31T00:00:00.000+00:00 in MongoDB
datetime(9999, 12, 31, 8, tzinfo=ZoneInfo('Asia/Taipei')) == HIGH_DATE
# True
datetime.strptime('9999/12/31 8:0:0', '%Y/%m/%d %H:%M:%S').replace(tzinfo=tz) == HIGH_DATE
# True
理想情况下,最高日期也应该是 9999 年 12 月 31 日的11:59:59 PM,但如果是 UTC,那么 UTC 之前的所有时区(例如台北)都会溢出。