我正在嘗試將 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 小時的班次。
uj5u.com熱心網友回復:
既然您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 的方式一致。
uj5u.com熱心網友回復:
因此,您似乎需要使用.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的示例和用法下找到了這個
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/472591.html
上一篇:在R中分組日期以創建患者事件?
下一篇:SQL:獲取具有特定時間戳的昨天
