![](/img/trans.png)
[英]How to determine if a timezone specific date in the past is daylight saving or not in python?
[英]List Daylight Saving start and finish over past x years
有没有办法为给定的时区(在本例中为伦敦)提取给定年份的夏令时的开始和结束时间。
我需要以 DateTime 格式显示过去 x 年伦敦夏令时的开始和结束。
例如,如果年 = 3
2016 27 March 02:00 30 October 02:00
2017 26 March 02:00 29 October 02:00
2018 25 March 02:00 28 October 02:00
有没有办法从 python 库中自动提取它,或者我应该查找它并创建我自己的列表?
这是一个函数,它使用二进制搜索来定位标记到/从夏令时转换的分钟。 它不依赖于任何秘密的内部数据结构。
import pytz
import datetime
def middle_date(d1, d2):
diff = d2 - d1
minutes = diff.total_seconds() // 60
if minutes < 48 * 60:
return d1 + datetime.timedelta(0, (minutes // 2) * 60)
days = diff.days
return d1 + datetime.timedelta(days // 2)
utc = pytz.utc
def saving_start_end(year, tz):
t1 = datetime.datetime(year, 1, 1, tzinfo=tz).astimezone(utc)
t4 = datetime.datetime(year, 12, 31, 23, 59, tzinfo=tz).astimezone(utc)
t2 = t3 = middle_date(t1, t4)
one_minute = datetime.timedelta(0, 60)
dst_start = t1.astimezone(tz).dst()
if dst_start == t2.astimezone(tz).dst():
t2 = None
else:
while t1 < t2:
mid = middle_date(t1, t2)
if mid.astimezone(tz).dst() == dst_start:
t1 = mid + one_minute
else:
t2 = mid
t2 = (t2 - one_minute).astimezone(tz) + one_minute
dst_mid = t3.astimezone(tz).dst()
if dst_mid == t4.astimezone(tz).dst():
t4 = None
else:
while t3 < t4:
mid = middle_date(t3, t4)
if mid.astimezone(tz).dst() == dst_mid:
t3 = mid + one_minute
else:
t4 = mid
t4 = (t4 - one_minute).astimezone(tz) + one_minute
return t2, t4
测试:
>>> central = pytz.timezone('America/Chicago')
>>> for dt in saving_start_end(2019, central): print(dt.isoformat(' '))
2019-03-10 02:00:00-06:00
2019-11-03 02:00:00-05:00
>>> london = pytz.timezone('Europe/London')
>>> for year in (2016, 2017, 2018):
start, end = saving_start_end(year, london)
print(start.isoformat(' '), end.isoformat(' '))
2016-03-27 01:00:00+00:00 2016-10-30 02:00:00+01:00
2017-03-26 01:00:00+00:00 2017-10-29 02:00:00+01:00
2018-03-25 01:00:00+00:00 2018-10-28 02:00:00+01:00
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.