gpt4 book ai didi

python - 如何处理重复事件中的 DST 和 TZ?

转载 作者:太空狗 更新时间:2023-10-29 17:45:01 25 4
gpt4 key购买 nike

dateutil rrule 是否支持 DST 和 TZ?需要类似于 iCalendar RRULE 的东西。

如果不是 - 如何解决这个问题(安排重复事件和 DST 偏移更改)

导入

>>> from django.utils import timezone
>>> import pytz
>>> from datetime import timedelta
>>> from dateutil import rrule
>>> now = timezone.now()
>>> pl = pytz.timezone("Europe/Warsaw")

timedelta 问题(需要具有相同的本地时间,但不同的 DST 偏移量):

>>> pl.normalize(now)
datetime.datetime(2012, 9, 20, 1, 16, 58, 226000, tzinfo=<DstTzInfo 'Europe/Warsaw' CEST+2:00:00 DST>)
>>> pl.normalize(now+timedelta(days=180))
datetime.datetime(2013, 3, 19, 0, 16, 58, 226000, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD>)

规则问题(每次发生的每个本地小时都需要相同):

>>> r = rrule.rrule(3,dtstart=now,interval=180,count=2)
>>> pl.normalize(r[0])
datetime.datetime(2012, 9, 20, 1, 16, 58, tzinfo=<DstTzInfo 'Europe/Warsaw' CEST+2:00:00 DST>)
>>> pl.normalize(r[1])
datetime.datetime(2013, 3, 19, 0, 16, 58, tzinfo=<DstTzInfo 'Europe/Warsaw' CET+1:00:00 STD>)

最佳答案

@asdf:我无法在评论中添加代码,所以我需要将其作为答案发布:

恐怕使用您的解决方案我总是会丢失 DST 信息,因此一年中有一半的重复时间将是 1 小时的休息时间。

根据您的回答,我发现这可能是正确的解决方案:

>>> from datetime import datetime
>>> import pytz
>>> from dateutil import rrule
>>> # this is raw data I get from the DB, according to django docs I store it in UTC
>>> raw = datetime.utcnow().replace(tzinfo=pytz.UTC)
>>> # in addition I need to store the timezone so I can do dst the calculations
>>> tz = pytz.timezone("Europe/Warsaw")
>>> # this means that the actual local time would be
>>> local = raw.astimezone(tz)
>>> # but rrule doesn't take into account DST and local time, so I must convert aware datetime to naive
>>> naive = local.replace(tzinfo=None)
>>> # standard rrule
>>> r = rrule.rrule(rrule.DAILY,interval=180,count=10,dtstart=naive)
>>> for dt in r:
>>> # now we must get back to aware datetime - since we are using naive (local) datetime,
# we must convert it back to local timezone
... print tz.localize(dt)

这就是我认为您的解决方案可能会失败的原因:

>>> from datetime import datetime
>>> from dateutil import rrule
>>> import pytz
>>> now = datetime.utcnow()
>>> pl = pytz.timezone("Europe/Warsaw")
>>> r = rrule.rrule(rrule.DAILY, dtstart=now, interval=180, count=2)
>>> now
datetime.datetime(2012, 9, 21, 9, 21, 57, 900000)
>>> for dt in r:
... local_dt = dt.replace(tzinfo=pytz.UTC).astimezone(pl)
... print local_dt - local_dt.dst()
...
2012-09-21 10:21:57+02:00
2013-03-20 10:21:57+01:00
>>> # so what is the actual local time we store in the DB ?
>>> now.replace(tzinfo=pytz.UTC).astimezone(pl)
datetime.datetime(2012, 9, 21, 11, 21, 57, 900000, tzinfo=<DstTzInfo 'Europe/Warsaw' CEST+2:00:00 DST>)

如您所见,规则结果与我们存储在数据库中的真实数据之间存在 1 小时的差异。

关于python - 如何处理重复事件中的 DST 和 TZ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com