本地化 daetime 时日期值超出范围#python

问题描述 投票:0回答:1

我正在尝试通过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 localized
1个回答
0
投票

从 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 之前的所有时区(例如台北)都会溢出。

© www.soinside.com 2019 - 2024. All rights reserved.