【问题标题】:Time inconsistencies in PythonPython中的时间不一致
【发布时间】:2011-09-04 16:28:10
【问题描述】:

我在跨平台程序中遇到了一些问题: 当我在 Linux 和 Windows 中打开 python shell 时,我从 Epoch 得到的时间不同。

在Linux中,我尝试过dpkg-reconfigure tzdata

目前,在 linux 中,我得到了 avec dpkg-reconfigure tzdata:

Current default time zone: 'Europe/London'
Local time is now:      Mon May 30 10:29:52 BST 2011.
Universal Time is now:  Mon May 30 09:29:52 UTC 2011.

然后,在 python 控制台中,我创建了这个脚本:

import time
print time.tzname, time.timezone, time.altzone, time.daylight
print time.localtime()
print time.localtime(0)

在 linux 上返回:

('GMT', 'BST') 0 -3600 1
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=30, tm_hour=11, tm_min=35, tm_sec=8, tm_wday=0, tm_yday=150, tm_isdst=1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

在返回的 Windows 上:

('GMT', 'GMT (heure d\x92\xe9t\xe9)') 0 -3600 1
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=30, tm_hour=11, tm_min=40, tm_sec=1, tm_wday=0, tm_yday=150, tm_isdst=1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

然后我尝试了这个脚本:

myTime = 0
dst = 0
while myTime < time.time():
   l = time.localtime(myTime)
   if l[8] is not dst:
       dst = l[8]
       print dst, l
myTime += 24*60*60

Linux 中返回的第一行是:

    1 time.struct_time(tm_year=1972, tm_mon=3, tm_mday=27, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=80, tm_isdst=1)
    0 time.struct_time(tm_year=1972, tm_mon=10, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=304, tm_isdst=0)
    1 time.struct_time(tm_year=1973, tm_mon=3, tm_mday=19, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=78, tm_isdst=1)
    0 time.struct_time(tm_year=1973, tm_mon=10, tm_mday=29, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=302, tm_isdst=0)
    IT CONTINUES UNTIL TODAY..................

Windows 中返回的第一行是:

    1 time.struct_time(tm_year=1970, tm_mon=3, tm_mday=30, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=89, tm_isdst=1)
    0 time.struct_time(tm_year=1970, tm_mon=10, tm_mday=26, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=299, tm_isdst=0)
    1 time.struct_time(tm_year=1971, tm_mon=3, tm_mday=29, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=88, tm_isdst=1)
    0 time.struct_time(tm_year=1971, tm_mon=11, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=305, tm_isdst=0)
    1 time.struct_time(tm_year=1972, tm_mon=3, tm_mday=27, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=87, tm_isdst=1)
    0 time.struct_time(tm_year=1972, tm_mon=10, tm_mday=30, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=304, tm_isdst=0)
    1 time.struct_time(tm_year=1973, tm_mon=3, tm_mday=26, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=85, tm_isdst=1)
    0 time.struct_time(tm_year=1973, tm_mon=10, tm_mday=29, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=302, tm_isdst=0)
    IT CONTINUES UNTIL TODAY..................

所以在 Windows 中,我们从 1970 年获得日期,而在 Linux 中,它从 1972 年开始!

如果我在我的 bash 控制台中写下:

zdump -v /usr/share/zoneinfo/Europe/London | grep 197

我明白了:

/usr/share/zoneinfo/Europe/London  Sun Oct 31 01:59:59 1971 UTC = Sun Oct 31 02:59:59 1971 BST isdst=0 gmtoff=3600
/usr/share/zoneinfo/Europe/London  Sun Oct 31 02:00:00 1971 UTC = Sun Oct 31 02:00:00 1971 GMT isdst=0 gmtoff=0
/usr/share/zoneinfo/Europe/London  Sun Mar 19 01:59:59 1972 UTC = Sun Mar 19 01:59:59 1972 GMT isdst=0 gmtoff=0
/usr/share/zoneinfo/Europe/London  Sun Mar 19 02:00:00 1972 UTC = Sun Mar 19 03:00:00 1972 BST isdst=1 gmtoff=3600
/usr/share/zoneinfo/Europe/London  Sun Oct 29 01:59:59 1972 UTC = Sun Oct 29 02:59:59 1972 BST isdst=1 gmtoff=3600
/usr/share/zoneinfo/Europe/London  Sun Oct 29 02:00:00 1972 UTC = Sun Oct 29 02:00:00 1972 GMT isdst=0 gmtoff=0
/usr/share/zoneinfo/Europe/London  Sun Mar 18 01:59:59 1973 UTC = Sun Mar 18 01:59:59 1973 GMT isdst=0 gmtoff=0
/usr/share/zoneinfo/Europe/London  Sun Mar 18 02:00:00 1973 UTC = Sun Mar 18 03:00:00 1973 BST isdst=1 gmtoff=3600
/usr/share/zoneinfo/Europe/London  Sun Oct 28 01:59:59 1973 UTC = Sun Oct 28 02:59:59 1973 BST isdst=1 gmtoff=3600
IT CONTINUES UNTIL 1979 !..........

如您所见,我们看不到 1970 年的任何东西!

如何将 Debian 的时区更改为我自己的时区!?

旧消息: 我在跨平台程序中面临一些问题: 当我在 Linux 和 Windows 中打开 python shell 时,我从 Epoch 得到的时间不同。

在 linux 中(debian 挤压):

>>> import time
>>> time.localtime()
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=30, tm_hour=10, tm_min=1, tm_sec=57, tm_wday=0, tm_yday=150, tm_isdst=1)
>>> time.localtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

在 Windows(7 64 位专业版)中:

>>> import time
>>> time.localtime()
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=30, tm_hour=10, tm_min=1, tm_sec=59, tm_wday=0, tm_yday=150, tm_isdst=1)
>>> time.localtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

如您所见,相差一个小时。为什么?



感谢您的回答,这就是我当时所做的: 在 Windows 中:

>>> time.tzname
('GMT', 'GMT (heure d\x92\xe9t\xe9)')
>>> time.timezone
0
>>> time.altzone
-3600
>>> time.daylight
1

在 Linux 中:

>>> time.tzname
('UTC', 'UTC')
>>> time.timezone
0
>>> time.altzone
0
>>> time.daylight
0

如果我不知道为什么会出现问题,我不想使用 gmtime。 我尝试更改 Linux 中的时间以使其与 Windows 中的时间相同(我开始在 Windows 中开发我的软件并且它运行良好,这就是为什么我想在 Linux 中更改系统时间而不是在 Windows 中)。 在 Linux 中,我尝试做dpkg-reconfigure tzdata。 但无论我选择的时间仍然是错误的。

目前,在 linux 中,我得到了 avec dpkg-reconfigure tzdata:

Current default time zone: 'Europe/London'
Local time is now:      Mon May 30 10:29:52 BST 2011.
Universal Time is now:  Mon May 30 09:29:52 UTC 2011.

我不明白在 Windows 中使用的是哪个时间。我正在使用“UTC”。



我创建了这个脚本:

import time
print time.tzname, time.timezone, time.altzone, time.daylight
print time.localtime()
print time.localtime(0)

在返回的 linux 上:

('GMT', 'BST') 0 -3600 1
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=30, tm_hour=11, tm_min=35, tm_sec=8, tm_wday=0, tm_yday=150, tm_isdst=1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=1, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

在返回的 Windows 上:

('GMT', 'GMT (heure d\x92\xe9t\xe9)') 0 -3600 1
time.struct_time(tm_year=2011, tm_mon=5, tm_mday=30, tm_hour=11, tm_min=40, tm_sec=1, tm_wday=0, tm_yday=150, tm_isdst=1)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)

如您所见,自纪元以来仍然存在时间问题(纪元凌晨 1 点......)



我创建了另一个主题,因为它似乎不再是由于 python: Timezone issues

【问题讨论】:

    标签: python time epoch localtime hour


    【解决方案1】:

    您的两台 PC 上的时间或时区设置是否不同?

    http://docs.python.org/library/time.html#time.gmtime

    上面的链接建议使用 time.gmtime() 来获取自 UTC 纪元以来的时间,而不是本地时间。

    【讨论】:

      【解决方案2】:

      这几乎可以肯定是由于两个环境之间的时区配置不同。

      检查time.tzname, time.timezone, time.altzone, time.daylight

      【讨论】:

      • 好的,在 Windows 中:&gt;&gt;&gt; time.tzname ('GMT', 'GMT (heure d\x92\xe9t\xe9)') &gt;&gt;&gt; time.timezone 0 &gt;&gt;&gt; time.altzone -3600 &gt;&gt;&gt; time.daylight 1 在 Linux : &gt;&gt;&gt; time.tzname ('UTC', 'UTC') &gt;&gt;&gt; time.timezone 0 &gt;&gt;&gt; time.altzone 0 &gt;&gt;&gt; time.daylight 0
      • 看起来你在一个上启用了 DST,但在另一个上没有启用
      • (我发在主题里了,里面更漂亮)怎么改?
      • 我在题目中回答了。问题还是一样。
      【解决方案3】:

      我意识到这是一个老问题,但我正在研究同一领域的一些问题并认为我会分享:

      从 1968 年到 1972 年,英国全年保持 BST

      这意味着那些年欧洲/伦敦的 DST 没有变化 - 所以你的 Linux 结果在那里是准确的。毫无疑问,“GMT”和“Europe/London”之间存在区别,因为 GMT 适用于该时区的所有国家/地区,而不仅仅是英国。

      参见,例如:http://wwp.greenwichmeantime.co.uk/daylight-saving-time/history-william-willetts.htm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 2012-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多