2017-01-23 9 views
2

У меня есть две отдельные машины (локальная разработка и сервер), которые получают доступ к одному и тому же дате времени из базы данных. Объекты DateTime имеют одинаковое значение (включая часовой пояс) на обеих машинах:Как заставить python datetime.strftime выводить в UTC?

Местное

print ts 
> datetime.datetime(2017, 1, 13, 7, 18, 9, 209000, tzinfo=<UTC>) 

Сервер

print ts 
> datetime.datetime(2017, 1, 13, 7, 18, 9, 209000, tzinfo=<UTC>) 

Однако выход strftime отличается на обеих машинах :

Местный

print ts.strftime('%s') 
> 1484320689 

Сервер

print ts.strftime('%s') 
> 1484291889 

Что здесь происходит? Как я могу заставить клиент и сервер выводить одну и ту же строку времени в UTC?

+0

Можете ли вы включить точный способ создания 'dt', чтобы мы могли реплицироваться правильно? Потому что я бы обычно использовал 'import datetime как dt', что означает, что' print dt' дает ''. Понятно, что это не реплицирует проблему (и отсутствует чтение базы данных), но мне не ясно, как сделать точный тест. – roganjosh

+0

@roganjosh dt - это просто имя переменной, которую я получаю из базы данных. Я переименовал его как «ts», чтобы избежать путаницы с импортом, например 'import datetime.datetime как dt'. – Paul

+0

Вы можете сделать аналогичный тестовый пример следующим образом: 'print datetime.utcnow(). Replace (tzinfo = pytz.utc) .strftime ('% s')' Запуск на двух отдельных машинах приведет к выдаче другого значение (более нескольких секунд), даже если 'datetime.utcnow()' одинаково на обеих машинах – Paul

ответ

0

В случае, если кто-либо наткнулся на это сообщение, я нашел решение.

Оказалось, что strftime всегда пытается преобразовать в местное время, и вы не можете с этим поделать.

Решение было использовать календарь:

return calendar.timegm(datetime.utcnow().timetuple()) 

Если вам нужен миллисекунды:

return calendar.timegm(self.timestamp.timetuple()) * 1000 + self.timestamp.microsecond/1000 

Или аналогичный микросекунды.