python日志模块在cygwin下报告不正确的时区
我正在运行python脚本,该脚本使用Windows7上cygwin下的日志模块。python日志模块在cygwin下报告不正确的时区,python,logging,timezone,Python,Logging,Timezone,我正在运行python脚本,该脚本使用Windows7上cygwin下的日志模块。date命令报告正确的时间: $ 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)
date
命令报告正确的时间:
$ 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)
有人能告诉我发生了什么以及我如何修复它吗?在导入日期/时间模块之前,您需要在python脚本中取消设置环境“TZ”。它由cygwin设置,但Windows无法理解:
if os.getenv("TZ"):
os.unsetenv("TZ")
似乎如果设置了
TZ
环境变量,Cygwin中的Python将在GMT(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_配置文件(在安装Cygwin的位置的子目录中)来自动进行修复。可以尝试将datefmt='%Y-%m-%d%H:%m:%s'
添加到日志记录.basicConfig
调用中吗?我正在使用Cygwin 1.7.16,它工作正常。日期和日志模块都返回时间戳。看起来它使用的是UTC?也许您需要设置TZ
环境变量。现在我倾向于使用本机应用程序而不是Cygwin。请看和。谢谢,我将尝试在评论中提出建议,明天再报告@保罗:我更愿意在考虑其他选择之前,先解决cygwin的问题。很有趣,@Yun Chen Sung。当我从脚本中执行时,这不起作用。如果在运行bash之前取消设置并从bash导出TZ,则会显示正确的时间。你知道为什么这个代码在Cygwin中不起作用吗?@Nikita:如果我在导入time
time之前这样做,那么时区将为我提供windows时区。如果在导入时间后执行此操作,则会得到错误的时区。我假设导入时time
检查$TZ
一次。这个解决方案对我不起作用(从Python内部取消TZ“太晚了”,我得到了错误的GMT行为),但我发现在调用Python之前在bash shell中运行“unset TZ”是有效的。自动修复的一种方法是在.bash_配置文件中粘贴“unset TZ”。我还建议在运行时对datetime.datetime.now()进行dbl检查datetime.datetime.utcnow()以适当的(小时)间隔,因为此行为似乎取决于Cygwin的确切版本。