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

DjangoTimezone

Django Problem Overview


I'm a bit confused by the daylight savings handling

settings.py:

TIME_ZONE = 'Europe/London'
USE_TZ = True

in the django shell:

>>> 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

why are they not the same with respect to daylight savings? Both should be locale aware, no?

I've read the docs but am none the wiser.

Django Solutions


Solution 1 - Django

According to timezone.now() source:

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()

It's based on utc instead of your default timezone. You could achieve same value by using

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

Solution 2 - Django

Since Django 1.11 you can simply call django.utils.timezone.localtime to fetch datetime for your default timezone.

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

From docs:

> Converts an aware datetime to a different time zone, by default the current time zone.

> When value is omitted, it defaults to now().

> This function doesn’t work on naive datetimes; use make_aware() instead.

Solution 3 - Django

You can pass a param to datetime.datetime.now():

import pytz, datetime
utc = pytz.utc
utc_now = datetime.datetime.now(tz=utc)

Or use timezone, a la:

from django.utils import timezone

now = timezone.now()

https://docs.djangoproject.com/en/2.1/topics/i18n/timezones/

Solution 4 - Django

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')

If you set TIME_ZONE = 'Europe/London' and USE_TZ = True in Django setting, it runs the try section, otherwise it runs the except section.


[NOTE]:

  • .strftime() is an option

Solution 5 - Django

from datetime import datetime
from pytz import timezone

# one can get any time for respective timezone
current_time = datetime.now(timezone('Asia/Kolkata'))
print("time in india :", current_time)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmeepmeepView Question on Stackoverflow
Solution 1 - DjangookmView Answer on Stackoverflow
Solution 2 - Djangovishes_shellView Answer on Stackoverflow
Solution 3 - DjangomecampbellsoupView Answer on Stackoverflow
Solution 4 - DjangoBenyamin JafariView Answer on Stackoverflow
Solution 5 - DjangoAshish SinghView Answer on Stackoverflow