Python中的时间不一致性
我在做一个跨平台的程序时遇到了一些问题:在Linux和Windows上打开Python命令行时,得到的时间不一样。
在Linux上,我尝试运行了 dpkg-reconfigure tzdata
。
现在,在Linux上通过这个命令得到的结果是:
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命令行时,得到的时间不一样。
在Linux(debian squeeze)上:
>>> 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上通过这个命令得到的结果是:
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)
如你所见,Epoch时间的问题依然存在(在Epoch时是凌晨1点...)
我创建了另一个话题,因为这似乎不再是Python的问题:时区问题
3 个回答
我知道这个问题已经有点老了,但我在研究相关问题时,觉得有必要分享一些信息:
从1968年到1972年,英国全年都使用夏令时
这意味着在那几年,欧洲/伦敦没有夏令时的变化,所以你在Linux上得到的结果是准确的。'GMT'和'Europe/London'之间确实有区别,因为GMT适用于所有在这个时区的国家,而不仅仅是英国。
比如,你可以查看这个链接了解更多信息:http://wwp.greenwichmeantime.co.uk/daylight-saving-time/history-william-willetts.htm
这很可能是因为两个环境的时区设置不一样。
你可以查看一下 time.tzname, time.timezone, time.altzone, time.daylight
这些内容。
你的电脑上的时间或时区设置是不是不一样?
http://docs.python.org/library/time.html#time.gmtime
上面的链接建议使用 time.gmtime() 来获取自纪元以来的时间,这个时间是以协调世界时(UTC)为标准的,而不是你本地的时间。