Python / Django templates timezone issue

13,981

Solution 1

Add the below snippet to the base.html

{% load tz %}

{% timezone "Asia/Kolkata" %}
  <All content goes here>
{% endtimezone %}

Inherit this to all templates. Everything render in 'Asia/Kolkata' time zone

Solution 2

Django always stores data in UTC with timezone aware info. Your settings.py is for America/Chicago therefore template renders it accordingly.

You can use timezone filters in your template to always show local time {{ image.created_at | localtime }}. At template start do {% load tz %} timezone tag library.

I.e.

{% load tz %}

<!-- template -->

{{ image.created_at | localtime }}

<!-- more template -->

Solution 3

From the docs:

localtime

Forces conversion of a single value to the current time zone.

For example:

{% load tz %}

{{ value|localtime }}

Solution 4

The TIME_ZONE setting is for the default (usually sever location timezone) to display time information related to the logged user you should read the documentation here

Share:
13,981
A.J.
Author by

A.J.

Updated on June 13, 2022

Comments

  • A.J.
    A.J. almost 2 years

    I am having the following issue, and cant figure out what i am missing here.

    I have enabled the Timezone in the settings.py

    Settings.py

    TIME_ZONE = 'America/Chicago'

    USE_TZ = True

    Use-case

    Now, when I have created an object at 3.15pm (Local time), and i get the following date stored in my created_at field in database.

    created_at = models.DateTimeField(auto_now_add=True)

    2014-12-12 11:03:48

    When i render that date in my templates i get the following value.

    {{ image.created_at }} = > Dec. 12, 2014, 5:03 a.m.

    TEST CASE

        from datetime import datetime
        from dateutil.tz import tzutc, tzlocal
    
        utc = datetime.now(tzutc())
        print('UTC:   ' + str(utc))
    
        local = utc.astimezone(tzlocal())
        print('Local: ' + str(local))
    

    I am getting correct datetime here. And when i use myobject.created_at.astimezone(tzlocal()) it also returns correct. but its when in Templates i get 1 hour ahead time. WHY? i tried both |local filter also but no use

    What am I missing?

  • s007
    s007 over 9 years
    As per testcase code I get expected timezone in template, no variation of 1 hr. Please share exact template code.