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 )
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 , 8 years ago
Description: | modified (diff) |
---|
comment:2 by , 8 years ago
comment:3 by , 8 years ago
Keywords: | timezone added |
---|---|
Resolution: | → invalid |
Status: | new → closed |
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.
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).