簡體   English   中英

在 DST 上添加時間增量后時區偏移錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM