2012-08-14 39 views
4

我运行python脚本不正确时区是在Windows 7中使用日志模块下的cygwin的date命令报告正确的时间:记录模块下的cygwin

$ date 
Tue, Aug 14, 2012 2:47:49 PM 

然而,Python脚本为五小时的休息时间:

2012-08-14 19:39:06,438: Done! 

当我配置的日志记录脚本我没有做任何幻想:

logging.basicConfig(format='%(asctime)-15s: %(message)s', level=logging.DEBUG) 

有人可以告诉我发生了什么,我该如何解决?

+0

你可以尝试在'logging.basicConfig'调用中添加'datefmt ='%Y-%m-%d%H:%M:%s''吗? – mgilson 2012-08-14 19:02:28

+0

我正在使用Cygwin 1.7.16,它能正常工作。日期和日志模块都返回时间戳。 – AlG 2012-08-14 19:09:12

+0

看起来像是使用UTC?也许你需要设置'TZ'环境变量。 – 2012-08-14 19:11:10

回答

7

在任何导入日期/时间模块之前,您需要在python脚本中取消设置环境“TZ”。它是由Cygwin的设置,但是不能被Windows理解:

if os.getenv("TZ"): 
    os.unsetenv("TZ") 
+1

有趣的@云珍成。从脚本执行时,这不起作用。如果我在运行之前取消设置并从bash中导出TZ,则会显示正确的时间。你知道为什么这个代码在Cygwin中不起作用吗? – 0x4B1D 2012-08-16 18:14:58

+1

@Nikita:如果我在导入'time'之前做了这个''time.timezone'给了我windows时区。如果我在导入'time'后执行此操作,则会得到错误的时区。我假设'time'在导入时会检查'$ TZ'。 – 2012-08-23 22:36:18

+0

@PeterGrahamyes,现在似乎工作,谢谢你的建议! – 0x4B1D 2012-08-24 15:21:12

2

看来,如果TZ环境变量设置,巨蟒在Cygwin的将在格林尼治标准时间(UTC)时区运作。即使将TZ设置为与Windows相同的时区,情况也是如此!

作为一种解决方法,您可以在调用Python之前在bash shell中调用unset TZ,然后Python将使用Windows时区。对我而言,删除Python中的ENV变量并不行,它需要在启动Python之前发生(即使在导入任何时间相关模块之前在Python进程中尽可能早地删除os.environ['TZ'],可能是因为必须导入os也许会触发Cygwin/Python“bug”,因此时区变成UTC?)。

可以通过将unset TZ添加到.bash_profile文件(位于/home/<user>这是Cygwin安装位置的子目录)中来自动修复此修补程序。