调试App Engine Python代码时,为什么时间戳不正确?

时间:2011-10-17 17:13:12

标签: python google-app-engine

在我的调试器下:

logging.info("TZ = %s -- It is now: %s", os.environ['TZ'], time.ctime())
TZ = UTC -- It is now: Mon Oct 17 12:10:44 2011

在App Engine Launcher下:

logging.info("TZ = %s -- It is now: %s", os.environ['TZ'], time.ctime())
TZ = UTC -- It is now: Mon Oct 17 17:09:24 2011

那么我设置错了什么?这不仅影响time.ctime(),而且还影响到调试数据库中的所有数据。我希望调试器在与应用程序引擎启动器相同的“时间范围”中运行,因为数据库中的时间戳,并且调试器比启动器慢,所以我不想一直使用它。

2 个答案:

答案 0 :(得分:5)

问题在于,使用Python 2.5的Windows上的C运行时函数似乎在第一次调用时间或ctime时缓存TZ环境变量的值。以下将以当地时间而不是UTC显示时间:

import time, os
time.time()
os.environ['TZ'] = 'UTC'
print time.ctime()

Wing的调试器在运行任何AppEngine代码之前调用time(),因此捕获了TZ的初始值。解决方法是通过项目属性对话框在环境变量中设置TZ = UTC。

答案 1 :(得分:0)

现在我更好地理解了您的问题(您希望调试器在UTC上运行,如GAE的默认值),这会让人感到兴奋和棘手。 logging.Formatter.formatTime默认根据time.localtime()格式化日期。要更改此设置,请将converter属性设置为time.gmtime()。这几乎没有记录,但我找到了一篇关于Logging with UTC Timestamps from Python的博客,可能就是你想要的。

告诉我这是否有用;可能是我仍然误解了你的要求。


旧答案: ctime将始终转换为当地时间。服务器上的本地时间与家用计算机的调试器的本地时间不同。您可以将os os.environ时区变量设置为您想要的任何值; time.ctime()无关紧要。

尝试formatting time.gmtime(),您将同时使用格林威治标准时间。

gmt = time.strftime("%a, %d %b %Y %H:%M:%S", time.gmtime())
logging.info("It is now: %s", gmt)
-- It is now: Mon 17 Oct 2011 19:11:10