Get local timezone in django
Solution 1:
The Django documentation for timezones documents all the necessary details for converting datetime
objects to the appropriate time zone for display.
Your data is stored in UTC which is good. When you obtain a DateTime
field object from the database it will be a naive datetime.datetime
object. ie A date/time without a timezone attached. It's then up to you to do the conversion.
User of your webapp may be in different time zones so the conversion to an appropriate time zone must occur for each request. This is why there is an activate function to set the current time zone.
If you have pytz installed you should be able to do the following:
from django.utils.timezone import activate
activate(settings.TIME_ZONE)
All output of date field in the template engine will then automatically convert you naive date time objects to the correct time zone for display.
If you just have a single naive datetime.datetime
instance that you want to set the time zone on, then just use the pytz
module directly. It is not normal to do this in your views though, as it's a good idea to only convert the time zone at the point of presentation.
from pytz import timezone
settings_time_zone = timezone(settings.TIME_ZONE)
last_updated = last_updated.astimezone(settings_time_zone)
Solution 2:
After cry a lot, I could show the correct date for my country doing something like this:
>>> from django.utils.timezone import get_current_timezone
>>> from front.models import Training
>>> tz = get_current_timezone()
>>> stored_date = Training.objects.first().start_date
datetime.datetime(2015, 4, 25, 17, 0, tzinfo=<UTC>)
>>> desired_date = stored_date + tz.utcoffset(stored_date)
datetime.datetime(2015, 4, 25, 14, 0, tzinfo=<UTC>)
The tzinfo
attribute is shows utc, but the date and time is correct to show.
UPDATE 30/10/2015 (Django 1.8)
I'm using another approach today, that is more django friendly
>>> from django.utils import timezone
>>> from trainings.models import Training
>>> value = Training.objects.first().date
>>> value
datetime.datetime(2015, 10, 23, 11, 32, 54, 633151, tzinfo=<UTC>)
>>> timezone.localtime(value)
datetime.datetime(2015, 10, 23, 9, 32, 54, 633151, tzinfo=<django.utils.timezone.LocalTimezone object at 0x7fa6129784a8>)
Solution 3:
localtime is a template filter, this may be helpful.
https://github.com/django/django/blob/1.8.4/django/utils/timezone.py#L298
Code sample:
from django.utils.timezone import localtime
desired_datetime = localtime(stored_datetime)