django 1.4 timezone.now () vs datetime.datetime.teraz()

Jestem trochę zdezorientowany przez obsługę daylight savings

Settings.py:

TIME_ZONE = 'Europe/London'
USE_TZ = True

W powłoce 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

Dlaczego nie są takie same w odniesieniu do czasu letniego? Obie powinny być świadome, prawda?

Czytałem dokumenty, ale nie jestem mądrzejszy.
Author: meepmeep, 2012-05-28

3 answers

Według 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()

Opiera się na utc zamiast domyślnej strefy czasowej. Możesz osiągnąć tę samą wartość używając

now = timezone.make_aware(datetime.datetime.now(),timezone.get_default_timezone())
print now.astimezone(timezone.utc)
 55
Author: okm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-14 06:50:14

Od Django 1.11 możesz po prostu wywołać django.utils.timezone.localtime aby pobrać datetime dla domyślnej strefy czasowej.

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

From docs:

Konwertuje świadomą datetime do innej strefy czasowej, domyślnie bieżącej strefy czasowej.

Gdy wartość jest pominięta, domyślnie wynosi now().

Ta funkcja nie działa na naiwnych datach; użyj make_aware() zamiast tego.

 5
Author: vishes_shell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-20 21:13:50
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')

Jeśli ustawisz TIME_ZONE = 'Europe/London' i USE_TZ = True w ustawieniu Django, umieścisz w sekcji try, a w sekcji except.


[Uwaga]:

  • .strftime() jest opcją
  • te przetestowane na Python 2.7 i Django 1.11
 0
Author: Benyamin Jafari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-20 09:05:56