【发布时间】:2018-03-30 10:31:31
【问题描述】:
为什么 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)
在美国的服务器上输出“日期”命令(中部夏令时,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
但是显示错误的结果,epoch 1522401308的正确时间是:
GMT: Friday, March 30, 2018 9:15:08 AM
Your time zone: Friday, March 30, 2018 5:15:08 PM GMT+08:00
【问题讨论】: