Reputation: 3118
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.
Upvotes: 83
Views: 137167
Reputation: 34046
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 optionUpvotes: 5
Reputation: 337
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)
Upvotes: 0
Reputation: 23494
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.
Upvotes: 37
Reputation: 1491
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/
Upvotes: 6
Reputation: 23871
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)
Upvotes: 109