夏令时 Linux 错误 1970-1980
Daylight savings Linux errors 1970-1980
当 运行 我的 Ubuntu 机器和 Windows 机器上的以下 python 脚本时,我在 1970 年得到了一个小时的时差。
$ python3 -c "
> import time
> import datetime
> print(time.strftime('%x %X%z %Z'))
> print(datetime.datetime.fromtimestamp((87*24+2)*60*60).isoformat())"
Ubuntu 16.04 / Python 3.5.2 说:
04/03/17 15:37:07+0200 CEST
1970-03-29T03:00:00
Windows 10 / Python 3.5.1 说:
04/03/17 15:37:06+0200 Västeuropa, sommartid
1970-03-29T04:00:00
(Windows 下的瑞典语文本表示 CEST。)因此时钟是正确的,我认为时区和夏令时也是如此。我认为 Windows 得到的结果是正确的,至少在那个时候 DST 应该发生。在 Ubuntu 上,DST 直到十年后的 1980 年 4 月 6 日才出现(Windows' DST 在 1980 年 3 月 30 日之后一周;我也认为这是正确的),但此后一切似乎都很好.
这是软件错误吗? Python以内? Ubuntu?还是我需要以某种方式做进一步的设置?我想这不太可能是 Python/Windows?
未正确特殊处理的日历怪癖
三年过去了。我花了几个小时才找到答案。原因是当时Linux下没有时区转换数据:
$ zdump -v Europe/Stockholm -c1900,1981
Europe/Stockholm Sun May 14 21:59:59 1916 UT = Sun May 14 22:59:59 1916 CET isdst=0 gmtoff=3600
Europe/Stockholm Sun May 14 22:00:00 1916 UT = Mon May 15 00:00:00 1916 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sat Sep 30 22:59:59 1916 UT = Sun Oct 1 00:59:59 1916 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sat Sep 30 23:00:00 1916 UT = Sun Oct 1 00:00:00 1916 CET isdst=0 gmtoff=3600
Europe/Stockholm Sun Apr 6 00:59:59 1980 UT = Sun Apr 6 01:59:59 1980 CET isdst=0 gmtoff=3600
Europe/Stockholm Sun Apr 6 01:00:00 1980 UT = Sun Apr 6 03:00:00 1980 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sun Sep 28 00:59:59 1980 UT = Sun Sep 28 02:59:59 1980 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sun Sep 28 01:00:00 1980 UT = Sun Sep 28 02:00:00 1980 CET isdst=0 gmtoff=3600
谁需要 1917 年到 1979 年之间的年份?计算是未来,而不是过去。 :D
当 运行 我的 Ubuntu 机器和 Windows 机器上的以下 python 脚本时,我在 1970 年得到了一个小时的时差。
$ python3 -c "
> import time
> import datetime
> print(time.strftime('%x %X%z %Z'))
> print(datetime.datetime.fromtimestamp((87*24+2)*60*60).isoformat())"
Ubuntu 16.04 / Python 3.5.2 说:
04/03/17 15:37:07+0200 CEST
1970-03-29T03:00:00
Windows 10 / Python 3.5.1 说:
04/03/17 15:37:06+0200 Västeuropa, sommartid
1970-03-29T04:00:00
(Windows 下的瑞典语文本表示 CEST。)因此时钟是正确的,我认为时区和夏令时也是如此。我认为 Windows 得到的结果是正确的,至少在那个时候 DST 应该发生。在 Ubuntu 上,DST 直到十年后的 1980 年 4 月 6 日才出现(Windows' DST 在 1980 年 3 月 30 日之后一周;我也认为这是正确的),但此后一切似乎都很好.
这是软件错误吗? Python以内? Ubuntu?还是我需要以某种方式做进一步的设置?我想这不太可能是 Python/Windows?
未正确特殊处理的日历怪癖三年过去了。我花了几个小时才找到答案。原因是当时Linux下没有时区转换数据:
$ zdump -v Europe/Stockholm -c1900,1981
Europe/Stockholm Sun May 14 21:59:59 1916 UT = Sun May 14 22:59:59 1916 CET isdst=0 gmtoff=3600
Europe/Stockholm Sun May 14 22:00:00 1916 UT = Mon May 15 00:00:00 1916 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sat Sep 30 22:59:59 1916 UT = Sun Oct 1 00:59:59 1916 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sat Sep 30 23:00:00 1916 UT = Sun Oct 1 00:00:00 1916 CET isdst=0 gmtoff=3600
Europe/Stockholm Sun Apr 6 00:59:59 1980 UT = Sun Apr 6 01:59:59 1980 CET isdst=0 gmtoff=3600
Europe/Stockholm Sun Apr 6 01:00:00 1980 UT = Sun Apr 6 03:00:00 1980 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sun Sep 28 00:59:59 1980 UT = Sun Sep 28 02:59:59 1980 CEST isdst=1 gmtoff=7200
Europe/Stockholm Sun Sep 28 01:00:00 1980 UT = Sun Sep 28 02:00:00 1980 CET isdst=0 gmtoff=3600
谁需要 1917 年到 1979 年之间的年份?计算是未来,而不是过去。 :D