Python:基于时间戳的DST获取时区
我编写了这样一个代码,以根据特定纪元时间的DST获取时区:Python:基于时间戳的DST获取时区,python,time,dst,epoch,Python,Time,Dst,Epoch,我编写了这样一个代码,以根据特定纪元时间的DST获取时区: def getTimeZoneFromEpoch(epoch) if time.daylight and time.gmtime(epoch).tm_isdst==1: return -time.altzone/3600.0 else: return -time.timezone/3600.0 但我不确定它是否正确,事实上目前我错了1个小时。也许我应该交换时区和时区 在这段代码中,但这不
def getTimeZoneFromEpoch(epoch)
if time.daylight and time.gmtime(epoch).tm_isdst==1:
return -time.altzone/3600.0
else:
return -time.timezone/3600.0
但我不确定它是否正确,事实上目前我错了1个小时。也许我应该交换时区和时区
在这段代码中,但这不是我从python的帮助(时间模块)中理解的:
我是否理解错了什么?我已经测试了这段代码以获得虚拟机的区域设置UTC偏移量。顺便说一句,它只有在被测量的那一刻才真正有效。我不确定你的代码是否等效
def local_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)
简而言之,使用
time.localtime()
而不是time.gmtime()
问题是您使用了
gmtime()
,如下程序的结果所示
from time import *
def getTimeZoneFromEpoch(epoch):
if daylight and gmtime(epoch).tm_isdst==1:
return -altzone/3600.0
else:
return -timezone/3600.0
print " 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
我的时钟设置为“UTC-07:00落基山脉”时区,DST从2011年3月13日开始,到2011年11月6日结束,结果是:
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
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
我的时钟设置为“UTC+01:00西欧大陆”时区,DST从2011年3月27日开始,到2011年10月30日结束,结果是:
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
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
感谢您的帮助,除了您建议的两种方法之外,我还发现了一个更灵活(可能更兼容)的版本,它还可以接受时区对象(或者只使用本地区域)并返回UTC偏移量 只是这个模棱两可的错误部分让我困惑,但我做了一些改变,使它(某种程度上)在所有情况下都能工作
from datetime import datetime
import pytz
from tzlocal import get_localzone
def getUtcOffsetByEpoch(epoch, tz=None):
if not tz:
tz = get_localzone()
delta = 0
while True:
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 += 3600
print('delta = %s'%delta)
except (
ValueError,
OverflowError,
):
return tz._utcoffset.total_seconds()
据我所知,大纪元时间是基于GMT的。不是吗?我应该写什么来代替那个函数呢?哦,是的,用localtime替换gmtime是正确的(正如我计算的位置)。Thanksnote:计算UTC偏移量。谢谢,经过一些pythonic修改,这也能正确工作。我将最后一行替换为
返回(datetime.datetime.fromtimestamp(epoch)-datetime.datetime.utcfromtimestamp(epoch)).seconds/3600.0
@ilius:应该是.total_seconds()
而不是。请注意,“UTC偏移量”和“时区”是完全不同的概念。对于两个或多个不同的区域设置时区,上述代码在任何给定时间都可能以相同的方式运行。fromtimstamp(epoch\u time)
如果在没有历史时区db(Python使用)的系统上(例如,对于2010年之前的日期,Windows with Europe/Moscow时区),时区在时间上具有不同的utc偏移,则过去的日期可能会失败<代码>pytz
,可以使用基于代码的解决方案。请参阅。由于本机Unix区域设置不像TZ数据库那样“纯粹”,因此如果使用偏移量将本地时间更正为UTC,则实际上可能需要返回过去历元时间的“错误”偏移量。我认为这取决于应用程序。UTC没有DST,因此gmtime(随时)。tm_isdst==0
。