import time
def monotoniclocaltime(seconds=None):
"""monotoniclocaltime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,
tm_sec,tm_wday,tm_yday,tm_isdst)
Convert seconds since the Epoch to a time tuple expressing monotonic
local time. Monotonicity is achieved by extending the day before the
end of DST with some extra hours (24, 25 etc) until after the switch."""
if seconds is None:
seconds = time.time()
res = time.localtime(seconds)
dayseconds = res.tm_sec + res.tm_min*60 + res.tm_hour*3600
nextmidnight = time.localtime(seconds - dayseconds + 86400)
if res.tm_isdst and not nextmidnight.tm_isdst:
tl = list(time.localtime(seconds - 86400)) # same time yesterday
tl[3] += 24 # plus 24h
res = time.struct_time(tl)
return res
def test():
def findswitch():
start = (int(time.time()) // 86400) * 86400
for t in range(start, start + 365*86400, 3600):
if monotoniclocaltime(t) != time.localtime(t):
return t
def iso8601(tup):
return "%04d-%02d-%02d %02d:%02d:%02d" % tuple(tup)[:6]
switch = findswitch()
if not switch:
print("No time zone transitions found in your local timezone")
return
for t in range(switch-3600*5, switch+3600*5, 3600):
print(iso8601(monotoniclocaltime(t-1)))
print(iso8601(monotoniclocaltime(t)))
if __name__ == '__main__':
test()