检测两个时间戳何时在Python中产生相同的本地时间的最快方法是什么?

时间:2011-04-21 20:52:59

标签: python datetime optimization dst

由于夏令时,UNIX时间戳12891060001289109600都代表美国东部EST / EDT时区的2010-11-07T01:00:00。我正在创建一个类似字典的对象,以时间戳为基础,需要将任何这样的对映射到相同的值。

此外,尽管我们希望避免过早优化,但我碰巧知道此操作是在非常严格的循环中执行的。任何解决方案都必须比使用fromtimestamp更快地获取每个时间戳的本地时间。

有没有办法构建我的对象的后端存储,或提前构建某种查找表,这可以实现这一点?

2 个答案:

答案 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