Python: Get Timezone Based On Dst For A Timestamp
Solution 1:
I've tested this code to obtain the VM's locale UTC offset. Which, by the way, is only really valid at the moment it is measured. I'm not sure whether your code is equivalent or not.
deflocal_ephemeral_UTC_offset(epoch_time=None):
u"Returns a datetime.timedelta object representing the local time offset from UTC at the moment"if epoch_time == None:
epoch_time = time()
return datetime.fromtimestamp(epoch_time) - datetime.utcfromtimestamp(epoch_time)
Solution 2:
In short, use time.localtime()
instead of time.gmtime()
.
The problem is that you use gmtime()
, as the result of the following program shows.
from time import *
def getTimeZoneFromEpoch(epoch):
if daylight andgmtime(epoch).tm_isdst==1:
return -altzone/3600.0else:
return -timezone/3600.0print" tm_isdst of tm_isdst of time zone's\n" + \
' epoch gmtime(epoch) localtime(epoch) offset'for d in ('13/03/2011', # DST start date in USA'14/03/2011',
'',
'06/11/2011', # DST end date in USA'07/11/2011',
'',
'27/03/2011', # DST start date in Europe'28/03/2011',
'',
'30/10/2011', # DST end date in Europe'31/10/2011'):
if d:
ds = strptime(d,'%d/%m/%Y')
epoch = mktime(ds)
lt = localtime(epoch)
gt = gmtime(epoch)
print'%s %s %12s %11s %7s %17s' % (d,ds.tm_isdst,epoch,gt.tm_isdst,lt.tm_isdst,getTimeZoneFromEpoch(epoch))
else:
print
With my clock set to the "UTC-07:00 Rocky Mountains" time zone, where the DST starts on March 13th 2011 and ends on November 06th 2011 , the result is:
tm_isdst of tm_isdst of time zone's
epoch gmtime(epoch) localtime(epoch) offset
13/03/2011 -1 1299999600.0 0 0 -7.0
14/03/2011 -1 1300082400.0 0 1 -7.0
06/11/2011 -1 1320559200.0 0 1 -7.0
07/11/2011 -1 1320649200.0 0 0 -7.0
27/03/2011 -1 1301205600.0 0 1 -7.0
28/03/2011 -1 1301292000.0 0 1 -7.0
30/10/2011 -1 1319954400.0 0 1 -7.0
31/10/2011 -1 1320040800.0 0 1 -7.0
With my clock set to the "UTC+01:00 West Continental Europe" time zone, where the DST starts on March 27th 2011 and ends on October 30th 2011 , the result is:
tm_isdst of tm_isdst of time zone's
epoch gmtime(epoch) localtime(epoch) offset
13/03/2011 -1 1299970800.0 0 0 1.0
14/03/2011 -1 1300057200.0 0 0 1.0
06/11/2011 -1 1320534000.0 0 0 1.0
07/11/2011 -1 1320620400.0 0 0 1.0
27/03/2011 -1 1301180400.0 0 0 1.0
28/03/2011 -1 1301263200.0 0 1 1.0
30/10/2011 -1 1319925600.0 0 1 1.0
31/10/2011 -1 1320015600.0 0 0 1.0
Solution 3:
Thanks for the help, besides the two methods that you suggested, I also found a more flexible (and maybe more compatible) version that can also take timezone object (or just use local zone) and return UTC offset
There was just this AmbiguousTimeError part that confused me, but I did something about it to make it (kind of) working in all cases.
from datetime import datetime
import pytz
from tzlocal import get_localzone
defgetUtcOffsetByEpoch(epoch, tz=None):
ifnot tz:
tz = get_localzone()
delta = 0whileTrue:
try:
return tz.utcoffset(datetime.fromtimestamp(epoch + delta)).total_seconds()
except pytz.exceptions.AmbiguousTimeError:## FIXME#d = datetime.fromtimestamp(epoch+3600)#print('AmbiguousTimeError', d.year, d.month, d.day, d.hour, d.minute, d.second)
delta += 3600print('delta = %s'%delta)
except (
ValueError,
OverflowError,
):
return tz._utcoffset.total_seconds()
Post a Comment for "Python: Get Timezone Based On Dst For A Timestamp"