Почему неправильные метки времени при отладке кода Python App Engine - PullRequest
5 голосов
/ 17 октября 2011

Под моим отладчиком:

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:

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 ]

5 голосов
/ 18 октября 2011

Проблема заключается в том, что функции времени выполнения C в Windows с Python 2.5, по-видимому, кэшируют значение переменной среды TZ при первом вызове time или ctime. Следующее время будет отображаться по местному времени, а не по UTC:

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

Отладчик Wing вызывает time () перед запуском любого кода AppEngine, чтобы было зафиксировано начальное значение TZ. Обходной путь должен установить TZ = UTC в переменных среды через диалог свойств проекта.

0 голосов
/ 17 октября 2011

Теперь, когда я лучше понимаю вашу проблему (вы хотите, чтобы ваш отладчик работал в UTC, как по умолчанию в GAE), это становится захватывающим и хитрым. logging.Formatter.formatTime по умолчанию форматирует даты в соответствии с time.localtime () . Чтобы изменить это, установите атрибут converter на time.gmtime () . Это едва задокументировано, но я нашел блог о ведении журнала с использованием меток времени UTC от Python , который может быть тем, что вы ищете.

Скажите, если это не поможет; может быть, я все еще неправильно понимаю, что вы спрашиваете.


Старый ответ: ctime всегда будет переводиться в местное время. Местное время на сервере отличается от местного времени для отладчика вашего домашнего компьютера. Вы можете установить переменную часового пояса os os.environ в любое положение; time.ctime() не волнует.

Попробуйте форматирование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...