Почему делает datetime.datetime.utcnow () не, содержат информацию о часовом поясе?

datetime.datetime.utcnow()

Почему делает это datetime не имеют любую информацию о часовом поясе, учитывая, что это - явно UTC datetime?

Я ожидал бы, что это будет содержать tzinfo.

248
задан amicitas 14 June 2017 в 15:01
поделиться

3 ответа

Это означает, что это наивный часовой пояс, поэтому вы не можете использовать его с 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 ()) - он может дать сбой во время перехода на летнее время, когда местное время неоднозначно.

177
ответ дан 23 November 2019 в 03:00
поделиться

Даты UTC не нуждаются в информации о часовом поясе, поскольку они UTC, что по определению означает, что у них нет смещения.

-13
ответ дан 23 November 2019 в 03:00
поделиться

Стандартные библиотеки 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)
69
ответ дан 23 November 2019 в 03:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: