【问题标题】:Why Python's time.timezone returns wrong offset seconds?为什么 Python 的 time.timezone 返回错误的偏移秒数?
【发布时间】: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

【问题讨论】:

    标签: python datetime timezone


    【解决方案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”会改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      相关资源
      最近更新 更多