为什么是Python';s time.timezone返回错误的偏移秒数?

为什么是Python';s time.timezone返回错误的偏移秒数?,python,datetime,timezone,Python,Datetime,Timezone,为什么Python的time.timezone返回错误的偏移秒数 我在两台位于不同时区的服务器上工作。两台服务器的时区设置似乎都很好(请忽略两台服务器之间的细微时差): 在中国服务器上发出“date”命令(中国标准时间,UTC+8): 在美国,服务器上发出“date”命令(中心夏时制,UTC-5): 但是当我使用Python的time.timezone获取偏移秒数时,它为美国服务器返回了错误的数字,但对中国来说是正确的: Python在中国服务器上的运行结果(正确的时区): Python在美国服

为什么Python的time.timezone返回错误的偏移秒数

我在两台位于不同时区的服务器上工作。两台服务器的时区设置似乎都很好(请忽略两台服务器之间的细微时差):

在中国服务器上发出“date”命令(中国标准时间,UTC+8):

在美国,服务器上发出“date”命令(中心夏时制,UTC-5):

但是当我使用Python的time.timezone获取偏移秒数时,它为美国服务器返回了错误的数字,但对中国来说是正确的:

Python在中国服务器上的运行结果(正确的时区):

Python在美国服务器上的运行结果(不正确时区):

为什么会这样?白天和标准时间有问题吗

此外,在没有pytz的情况下,如何以具有特定时区偏移量的可读格式显示datetime值?(我不是该服务器的管理员,因此无法安装pytz)

我之所以使用time.timezone,是因为我想读取一个历元数字(按照惯例,它总是以UTC为单位),然后以美国当地时间和中国时间打印出来

>>> time_epoch_str = '1522401308'
>>> time_dt = dt.fromtimestamp(int(time_epoch_str))
>>> utc_time_delta = timedelta(seconds=time.timezone)
>>> china_time_delta = utc_time_delta + timedelta(hours=8)
>>> print("U.S.A. time: %s; UTC time: %s; China time: %s" 
... % (time_dt, time_dt + utc_time_delta, time_dt + china_time_delta))
U.S.A. time: 2018-03-30 04:15:08; UTC time: 2018-03-30 10:15:08; China time: 2018-03-30 18:15:08
但它显示了错误的结果,纪元1522401308的正确时间为:

GMT: Friday, March 30, 2018 9:15:08 AM
Your time zone: Friday, March 30, 2018 5:15:08 PM GMT+08:00

要获取某个时间的实际时区,必须使用“time”实例的“tmdst”

这个答案的原始版本建议使用“time.daylight”,但这个标志是不变的,不会改变。它说明是否设置了“altzone”(夏令时偏移),一旦设置,“time.daylight”始终为“1”,无论当前时间是否为夏令时

要获得正确的时间偏移,应使用以下代码:

t = time.localtime()
if t.tm_isdst == 0:
    tz_offset = time.timezone
else:
    tz_offset = time.altzone
以下是原始答案:

哈哈哈,我终于发现我错过了什么。我应该更仔细地研究Python文档

检查以下Python文档:

这确实是夏令时的问题。我应该将代码更改为:

if time.daylight == 0:
    utc_time_delta = timedelta(seconds=time.timezone)
else:
    utc_time_delta = timedelta(seconds=time.altzone)
“time.timezone”不会自动更改,但“time.daylight”会更改

>>> time_epoch_str = '1522401308'
>>> time_dt = dt.fromtimestamp(int(time_epoch_str))
>>> utc_time_delta = timedelta(seconds=time.timezone)
>>> china_time_delta = utc_time_delta + timedelta(hours=8)
>>> print("U.S.A. time: %s; UTC time: %s; China time: %s" 
... % (time_dt, time_dt + utc_time_delta, time_dt + china_time_delta))
U.S.A. time: 2018-03-30 04:15:08; UTC time: 2018-03-30 10:15:08; China time: 2018-03-30 18:15:08
GMT: Friday, March 30, 2018 9:15:08 AM
Your time zone: Friday, March 30, 2018 5:15:08 PM GMT+08:00
t = time.localtime()
if t.tm_isdst == 0:
    tz_offset = time.timezone
else:
    tz_offset = time.altzone
if time.daylight == 0:
    utc_time_delta = timedelta(seconds=time.timezone)
else:
    utc_time_delta = timedelta(seconds=time.altzone)