[英]Wrong timezone shift after adding a time delta over DST
我正在嘗試將 tz 感知時間戳轉移一個月。 由於datetime.timedelta
沒有月份選項,因此應該使用包relativedelta
。
當時間點在夏季 DST 之后並且移位之后的結果將在夏季 DST 之前時,就會出現問題。
例如,將2022-04-26 07:00:00+02:00
移回一個月。 預計為2022-03-26 07:00:00+01:00
但是,結果將是2022-03-26 07:00:00+02:00
(+02:00 而不是 +01:00)
這是一個代碼示例:
import pytz
import datetime
from dateutil.relativedelta import relativedelta
berlin = pytz.timezone("Europe/Berlin")
base_date = berlin.localize(datetime.datetime(2022, 4, 26, 7, 0))
offset = relativedelta(months=1, day=0,
hour=base_date.hour, minute=base_date.minute,
second=base_date.second, microsecond=0)
shifted = base_date - offset
expected = berlin.localize(datetime.datetime(2022, 3, 26, 7, 0))
print("shifted: ", shifted)
print("expected: ", expected)
這將打印:
shifted: 2022-03-26 07:00:00+02:00
expected: 2022-03-26 07:00:00+01:00
結果是錯誤的,因為2022-03-26 CET
日必須始終有 +1 小時的班次。
既然您仍然使用dateutil
,為什么不將它用於 tz 處理?
from datetime import datetime
import dateutil
offset = dateutil.relativedelta.relativedelta(months=1)
dt = datetime(2022,4,26,7,tzinfo=dateutil.tz.gettz("Europe/Berlin"))
print(dt, dt-offset)
# 2022-04-26 07:00:00+02:00 2022-03-26 07:00:00+01:00
旁注, dateutil 語義也與Python 3.9 處理 time zone 的方式一致。
因此,您似乎需要使用.astimezone
來獲得所需的結果。 如下所示。
import pytz
import datetime
from dateutil.relativedelta import relativedelta
berlin = pytz.timezone("Europe/Berlin")
base_date = berlin.localize(datetime.datetime(2022, 4, 26, 7, 0))
offset = relativedelta(months=1)
shifted = (base_date - offset).astimezone(berlin)
# shifted = shifted.astimezone(berlin)
expected = berlin.localize(datetime.datetime(2022, 3, 26, 7, 0))
print("base:", base_date)
print("shifted: ", shifted)
print("expected: ", expected)
我在PyTz的示例和用法下找到了這個
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.