由于夏令时,UNIX时间戳1289106000
和1289109600
都代表美国东部EST / EDT时区的2010-11-07T01:00:00
。我正在创建一个类似字典的对象,以时间戳为基础,需要将任何这样的对映射到相同的值。
此外,尽管我们希望避免过早优化,但我碰巧知道此操作是在非常严格的循环中执行的。任何解决方案都必须比使用fromtimestamp
更快地获取每个时间戳的本地时间。
有没有办法构建我的对象的后端存储,或提前构建某种查找表,这可以实现这一点?
答案 0 :(得分:2)
您可以根据自己的意愿建立一张桌子,延伸到过去或未来,每年重叠一小时。通过简单的划分将时间戳转换为近似年份很容易。从年份中查找元组(start_leap_hour,end_leap_hour);如果时间戳在它们之间,则减去一个小时。
答案 1 :(得分:1)
关于如何生成DST关键时间表:
这将生成夏令时“后退”发生时的日期时间:
import datetime as dt
import time
import itertools
def fall_dst_boundaries(date=None):
'''
Generates the datetimes when Daylight Savings Time "fall back" occurs after date.
'''
if date is None:
date=dt.datetime.now()
timestamp=time.mktime(date.timetuple())//3600 * 3600
previous_date=dt.datetime.fromtimestamp(timestamp)
while True:
timestamp+=3600
date=dt.datetime.fromtimestamp(timestamp)
if date==previous_date:
yield date
previous_date=date
for date in itertools.islice(fall_dst_boundaries(dt.datetime(1980,1,1)),15):
print(date)
的产率:
1980-10-26 01:00:00
1981-10-25 01:00:00
1982-10-31 01:00:00
1983-10-30 01:00:00
1984-10-28 01:00:00
1985-10-27 01:00:00
1986-10-26 01:00:00
1987-10-25 01:00:00
1988-10-30 01:00:00
1989-10-29 01:00:00
1990-10-28 01:00:00
1991-10-27 01:00:00
1992-10-25 01:00:00
1993-10-31 01:00:00
1994-10-30 01:00:00
PS。 DST在凌晨2点结束,但重复的时间是凌晨1点。
要生成“后退”和“前进”日期时间,您可以使用以下内容:
def DST_boundaries(date=None):
'''
Generates the datetimes when Daylight Savings Time "fall back" or "spring
forward" occurs after date.
'''
if date is None:
date=dt.datetime.now()
timestamp=time.mktime(date.timetuple())//3600 * 3600 + 3599
previous_date=dt.datetime.fromtimestamp(timestamp)
while True:
timestamp+=3600
date=dt.datetime.fromtimestamp(timestamp)
if date==previous_date or date.hour-previous_date.hour>1:
yield previous_date
previous_date=date