time.strftime的时区问题

1 投票
1 回答
1671 浏览
提问于 2025-04-16 08:07

我已经使用blockhosts一段时间了,感觉挺不错的。最近我把Ubuntu更新到了10.10,结果开始出现一些奇怪的情况。仔细查看后,我发现/var/log/blockhosts.log里有一堆错误信息:

错误:无法解析IP 188.17.155.25的日期,使用当前时间: 时间数据 '2010-11-01 03:04:02 AMT' 与格式 '%Y-%m-%d %H:%M:%S %Z' 不匹配

这里的时区显示为“AMT”(亚美尼亚时间)真是奇怪。我设置的时区是:

$ cat /etc/timezone
Europe/Amsterdam

我查看了blockhosts.py的代码,发现日期是作为time对象处理的。

下面的代码展示了问题所在:

import time

now = time.time()

str1 = time.strftime('%Y-%m-%d %H:%M:%S %Z', time.localtime())
str2 = time.strftime('%Y-%m-%d %H:%M:%S %Z')

print str1
print str2

输出结果是:

2010-12-06 16:18:47 AMT 
2010-12-06 16:18:47 CET

time.tzname的值是('CET', 'CEST'),所以我不太明白“AMT”是从哪里来的……

任何帮助都非常感谢!

更新:

根据评论中的建议:

  • /etc/localtime并不是指向/usr/share/zoneinfo/Europe/Amsterdam的符号链接,但它们是同一个文件:

$ ls -l /etc/localtime
-rw-r--r-- 1 root root 2917 2010-11-18 09:35 /etc/localtime
$ ls -l /usr/share/zoneinfo/Europe/Amsterdam
-rw-r--r-- 1 root root 2917 2010-11-11 09:35 /usr/share/zoneinfo/Europe/Amsterdam
$ diff /etc/localtime /usr/share/zoneinfo/Europe/Amsterdam

  • 没有TZ环境变量:

$ echo $TZ
$ env | grep TZ

  • 我以另一个用户身份登录并运行脚本,结果也是一样:

2010-12-07 11:12:09 AMT
2010-12-07 11:12:09 CET

1 个回答

0

时间模块其实就是在调用一些Unix系统的C语言接口,所以我首先会怀疑你的配置是否有问题。

不过,time.strftime('%Y-%m-%d %H:%M:%S %Z', time.localtime())time.strftime('%Y-%m-%d %H:%M:%S %Z') 应该是一样的,因为time.localtime()是默认的参数,所以我也搞不懂它们有什么不同。

撰写回答