2016-05-10 3 views
0

Я работаю над приложением Python, которое запускает уведомления в определенное время. Я начал работать над этим проектом в Италии, и программа отлично работала, но теперь, когда я вернулся в США, время совершенно неверно. Между фактическим временем и временем, которое показано, существует разница в 4 часа, что является странным, потому что Италия на 6 часов вперед.Перемещенные часовые пояса теперь datetime.utcnow() неверно

Например, время, которое datetime.utcnow() показывает, является 2016-05-10T18: 55: 47.920001Z но время на самом деле 2016-05-10T14: 55: 47.920001Z

now = datetime.datetime.utcnow().isoformat() + 'Z' # 'Z' indicates UTC time 

Я попробовал использовать pytz, чтобы установить часовой пояс (который дает мне правильное время), но API, который я отправляю текущее время (Календарь Google), не примет его. Это время не принято, но строка кода выше, но время неверно.

eastern = pytz.timezone("America/New_York") 
now = datetime.datetime.now(tz=eastern).isoformat() + 'Z' # 'Z' indicates UTC time 

Как я могу получить datetime.datetime.utcnow(), чтобы отразить мое текущее время?

+0

Pat проблемы может быть то, что вы используете 'datetime' конструктор для назначения' pytz' часового пояса - [по к документации] (http://pytz.sourceforge.net/#localized-times-and-date-arithmetic), которая не всегда работает должным образом. –

ответ

0

Try:.

from datetime import datetime, timezone 

Теперь = datetime.now (timezone.utc) .astimezone() isoformat() + 'Z' # 'Z' указывает время UTC печать (сейчас)

0

.utcnow() Время возврата в UTC. Он возвращает то же самое значение, где бы вы ни находились. Время UTC такое же, как в Италии и в США.

Для генерации rfc3339 timestamp: .utcnow().isoformat() + 'Z' верен.

datetime.now(eastern).isoformat() + 'Z' неправ. Используйте только datetime.now(eastern).isoformat():

>>> from datetime import datetime 
>>> import pytz 
>>> eastern = pytz.timezone('America/New_York') 
>>> datetime.utcnow().isoformat()+'Z', datetime.now(eastern).isoformat() 
('2016-05-11T15:25:18.857833Z', '2016-05-11T11:25:18.857860-04:00') 

Оба возвращают в то же время (если мы будем игнорировать микросекунд). Сегодня, 15: 25UTC то же самое время, как 11:25 в Нью-Йорке:

<local time> == <utc time> + <utc offset> 
    11:25  == 15:25 + (-04:00)