我正在尝试通过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 date, datetime, timedelta, timezone
from zoneinfo import ZoneInfo
tz = ZoneInfo('Asia/Taipei')
date_string = '9999/12/31'
# method 1
date_localized = datetime.strptime(date_string, '%Y/%m/%d')
# datetime.datetime(9999, 12, 31, 0, 0)
# 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
# method 3 not needed
此外,我建议您将 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
理想情况下,最高日期也应该是 9999 年 12 月 31 日的11:59:59 PM,但如果是 UTC,那么 UTC 之前的所有时区(例如台北)都会溢出。