datetime.datetime.utcnow()
Почему делает это datetime
не имеют любую информацию о часовом поясе, учитывая, что это - явно UTC datetime
?
Я ожидал бы, что это будет содержать tzinfo
.
Это означает, что это наивный часовой пояс, поэтому вы не можете использовать его с datetime.astimezone
, вы можете указать часовой пояс, как этот
import pytz # 3rd party: $ pip install pytz
u = datetime.utcnow()
u = u.replace(tzinfo=pytz.utc) #NOTE: it works only with a fixed utc offset
теперь вы можете изменять часовые пояса.
print(u.astimezone(pytz.timezone("America/New_York")))
Чтобы получить текущее время в данном часовом поясе, вы можете напрямую передать tzinfo в datetime.now ()
:
#!/usr/bin/env python
from datetime import datetime
import pytz # $ pip install pytz
print(datetime.now(pytz.timezone("America/New_York")))
Он работает для любого часового пояса, включая те, которые соблюдать летнее время (DST), т.е. он работает для часовых поясов, которые могут иметь разные смещения utc в разное время (нефиксированное смещение utc). Не используйте tz.localize (datetime.now ())
- он может дать сбой во время перехода на летнее время, когда местное время неоднозначно.
Даты UTC не нуждаются в информации о часовом поясе, поскольку они UTC, что по определению означает, что у них нет смещения.
Стандартные библиотеки Python не включают никаких классов tzinfo (но см. Pep 431 ). О причинах могу только догадываться. Лично я считаю ошибкой не включать класс tzinfo для UTC, потому что он достаточно бесспорный, чтобы иметь стандартную реализацию.
Редактировать: Хотя в библиотеке нет реализации, она приведена в качестве примера в документации tzinfo
.
from datetime import timedelta, tzinfo
ZERO = timedelta(0)
# A UTC class.
class UTC(tzinfo):
"""UTC"""
def utcoffset(self, dt):
return ZERO
def tzname(self, dt):
return "UTC"
def dst(self, dt):
return ZERO
utc = UTC()
Чтобы использовать его, чтобы получить текущее время как известный объект datetime:
from datetime import datetime
now = datetime.now(utc)
В Python 3.2 + есть datetime.timezone.utc
:
from datetime import datetime, timezone
now = datetime.now(timezone.utc)