【问题标题】:logging module for python reports incorrect timezone under cygwinpython的日志记录模块在cygwin下报告不正确的时区
【发布时间】:2012-08-11 03:10:45
【问题描述】:

我在 Windows 7 上运行使用 cygwin 下的日志记录模块的 python 脚本。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)

谁能告诉我发生了什么以及如何解决它?

【问题讨论】:

  • 您可以尝试将datefmt = '%Y-%m-%d %H:%M:%s' 添加到logging.basicConfig 调用中吗?
  • 我使用的是 Cygwin 1.7.16,它工作正常。日期和日志模块都返回时间戳。
  • 看起来它使用的是 UTC?也许你需要设置TZ 环境变量。
  • 现在我倾向于使用本机应用程序而不是 Cygwin。看看GowConEmu
  • 谢谢,我会在 cmets 中尝试建议,明天再报告。 @Paulo 在查看替代方案之前,我更愿意在 cygwin 下解决问题。

标签: python logging timezone


【解决方案1】:

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

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

【讨论】:

  • 有趣,@Yun-Chen Sung。当我从脚本中执行此操作时,这不起作用。如果我在运行之前从 bash 中取消设置并导出 TZ,则会显示正确的时间。你知道为什么这段代码在 Cygwin 中不起作用吗?
  • @Nikita:如果我在导入 time time.timezone 之前这样做,就会给我 Windows 时区。如果我在导入 time 后执行此操作,我会得到错误的时区。我假设time 在导入时检查一次$TZ
  • 这个解决方案对我不起作用(从 Python 内部取消设置 TZ“为时已晚”并且我得到了不正确的 GMT 行为)但我发现在调用之前在 bash shell 中运行“unset TZ” Python工作。自动化修复的一种方法是在您的 .bash_profile 中粘贴“unset TZ”。我还建议在运行时 dbl-checking datetime.datetime.now() != datetime.datetime.utcnow() 适当的(小时)余量,因为这种行为似乎取决于 Cygwin 的确切版本。
【解决方案2】:

似乎如果设置了TZ 环境变量,Cygwin 中的 Python 将在 GMT (UTC) 时区运行。即使TZ 设置为与 Windows 框相同的时区也是如此!

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

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

【讨论】:

    猜你喜欢
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多