Подтвердить что ты не робот

Django 1.4 timezone.now() vs datetime.datetime.now()

Я немного смущен обработкой летнего времени

settings.py:

TIME_ZONE = 'Europe/London'
USE_TZ = True

в оболочке django:

>>> from django.utils import timezone
>>> import datetime
>>> print timezone.now()
2012-05-28 11:19:42.897000+00:00
>>> print timezone.make_aware(datetime.datetime.now(),timezone.get_default_timez
one())
2012-05-28 12:20:03.224000+01:00

почему они не совпадают с летней экономией? Оба должны знать локали, не?

Я читал документы, но я не мудрее.

4b9b3361

Ответ 1

Согласно источнику timezone.now():

def now():
    """
    Returns an aware or naive datetime.datetime, depending on settings.USE_TZ.
    """
    if settings.USE_TZ:
        # timeit shows that datetime.now(tz=utc) is 24% slower
        return datetime.utcnow().replace(tzinfo=utc)
    else:
        return datetime.now()

Он основан на utc вместо вашего часового пояса по умолчанию. Вы можете достичь того же значения, используя

now = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone())
print now.astimezone(timezone.utc)

Ответ 2

Начиная с Django 1.11 вы можете просто вызвать django.utils.timezone.localtime для получения datetime для вашего часового пояса по умолчанию.

>>> from django.utils import timezone
>>> timezone.localtime()

Из документов:

Преобразует значащее время и время в другой часовой пояс, по умолчанию - текущий часовой пояс.

Когда значение опущено, по умолчанию оно используется now().

Эта функция не работает с наивными датами; вместо этого используйте make_aware().

Ответ 3

from datetime import datetime
from django.utils import timezone

def now():
    try:
        return timezone.localtime(timezone.now()).strftime('%Y-%m-%dT%H:%M:%S')

    except Exception as exp:
        print('TimeZone is not set - {}'.format(exp))
        return datetime.now().strftime('%Y-%m-%dT%H:%M:%S')

Если вы установите TIME_ZONE = 'Europe/London' и USE_TZ = True в настройке Django, вы поместите в раздел try а в разделе "За except ".


[ ПРИМЕЧАНИЕ ]:

  • .strftime() является опцией
  • Они тестировались на Python 2.7 и Django 1.11