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

时间:2018-03-30 10:31:31

标签: python datetime timezone

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

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

' date'中国服务器上的命令(中国标准时间,UTC + 8):

$ date ; date -u ; date '+%Z (%:::z)'
Fri Mar 30 17:52:06 CST 2018
Fri Mar 30 09:52:06 UTC 2018
CST (+08)

' date'美国服务器上的命令(中部夏令时,UTC-5):

$ date ; date -u ; date '+%Z (%:::z)'
Fri Mar 30 04:56:52 CDT 2018
Fri Mar 30 09:56:52 UTC 2018
CDT (-05)

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

Python在中国服务器上运行结果(正确的time.timezone):

$ python
Python 2.7.5 (default, Nov  6 2016, 00:28:07)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime as dt
>>> from datetime import timedelta
>>> import time
>>> print dt.now()
2018-03-30 17:45:51.661311
>>> print dt.utcnow()
2018-03-30 09:45:51.661738
>>> print time.timezone
-28800  # This is -8 hours
>>> utc_time_delta = timedelta(seconds=time.timezone) ; print utc_time_delta;
-1 day, 16:00:00
>>>

Python在美国服务器上运行结果(不正确 time.timezone):

$ python
Python 2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime as dt
>>> from datetime import timedelta
>>> import time
>>> print dt.now()
2018-03-30 04:50:36.261980
>>> print dt.utcnow()
2018-03-30 09:50:36.262212
>>> print time.timezone
21600  # This is +6 hours (incorrect)
>>> utc_time_delta = timedelta(seconds=time.timezone) ; print utc_time_delta;
6:00:00
>>>

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

此外,如何以具有特定时区偏移而不是pytz的人类可读格式显示日期时间值? (我不是该服务器的管理员所以我无法安装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

1 个答案:

答案 0 :(得分:1)

要获得一段时间的实际时区,你必须使用" tm_dst"一个"时间"实例

此答案的原始版本建议使用" 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文档: https://docs.python.org/2/library/time.html#time.altzone

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

if time.daylight == 0:
    utc_time_delta = timedelta(seconds=time.timezone)
else:
    utc_time_delta = timedelta(seconds=time.altzone)

" time.timezone"不会自动更改,但" time.daylight"变化。