Opened 8 years ago

Closed 8 years ago

#26711 closed Bug (invalid)

Aware datetimes rendered through templates are changed to TIME_ZONE

Reported by: Antonis Christofides Owned by: nobody
Component: Template system Version: 1.9
Severity: Normal Keywords: timezone
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Antonis Christofides)

Start a new project with django-admin startproject, then start a shell with ./manage.py shell and execute these commands:

from datetime import datetime
import sys

from django.template import Context, Template

import pytz

# Set adatetime to 2015-10-03 02:00 EEST (+0300)
athens = pytz.timezone('Europe/Athens')
adatetime = athens.localize(datetime(2015, 10, 3, 2, 0))

# Render that date in a template
template = Template(
    'Take note of this date: {{ adatetime|date:"Y-m-d H:i e (O)" }}')
result = template.render(Context({'adatetime': adatetime}))
sys.stdout.write(result)

Result: 2015-10-02 23:00 UTC (+0000)

Expected: 2015-10-03 02:00 EEST (+0300)

These are actually the same time displayed in different time zones. Django chooses to display the time in the TIME_ZONE setting. I thought it would be more logical to leave an aware datetime untouched.

If this behavior is correct: How am I going to do what I want, which is to render the aware datetime in its own time zone?

Change History (3)

comment:1 by Antonis Christofides, 8 years ago

Description: modified (diff)

comment:2 by Antonis Christofides, 8 years ago

The behavior is the same in 1.8, 1.9, and master.

According to the documentation for the template date filter, the time zone name produced by the e format character "[c]ould be in any format, or might return an empty string, depending on the datetime." But with the current behavior it doesn't seem to depend on the datetime, but only on the TIME_ZONE setting.

I investigated briefly and I think that it's not the date template filter that does it; this apparently receives an already modified date. So the change of time zone occurs earlier (but I'm not 100% certain on that).

comment:3 by Simon Charette, 8 years ago

Keywords: timezone added
Resolution: invalid
Status: newclosed

Aware datetimes are rendered using the current timezone (django.utils.timezone.get_current_timezone()) just like strings marked for translation are rendered using the current language (django.utils.language.get_language()) by design.

If you want to prevent this conversion to the current timezone you should use the localtime template tag to turn it off.

{% load tz %}
{% localtime off %}
    Take note of this date: {{ adatetime|date:"Y-m-d H:i e (O)" }}
{% endlocaltime %}

Please reopen the ticket if I missed something.

Note: See TracTickets for help on using tickets.
Back to Top