Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django with system timezone setting vs user's individual timezones

How well does Django handle the case of different timezones for each user? Ideally I would like to run the server in the UTC timezone (eg, in settings.py set TIME_ZONE="UTC") so all datetimes were stored in the database as UTC. Stuff like this scares me which is why I prefer UTC everywhere.

But how hard will it be to store a timezone for each user and still use the standard django datetime formatting and modelform wrappers. Do I anticipate having to write date handling code everywhere to convert dates into the user's timezone and back to UTC again?

I am still going through the django tutorial but I know how much of a pain it can be to deal with user timezones in some other frameworks that assume system timezone everywhere so I thought I'd ask now.

My research at the moment consisted of searching the django documentation and only finding one reference to timezones.


Additional:

  • There are a few bugs submitted concerning Django and timezone handling.
  • Babel has some contrib code for django that seems to deal with timezone formatting in locales.
like image 862
Nick Sonneveld Avatar asked Jun 30 '09 05:06

Nick Sonneveld


People also ask

What is the default timezone setting in Django?

Django's timezone is set to UTC by default.

How does Django handle time zones?

The solution to this problem is to use UTC in the code and use local time only when interacting with end users. Time zone support is disabled by default. To enable it, set USE_TZ = True in your settings file. In Django 5.0, time zone support will be enabled by default.

Which function allows you to find the user's timezone?

You can set any specific time zone using the PHP function date_default_timezone_set . This sets the specified time zone for users. Basically the users' time zone is goes to the client side, so we must use JavaScript for this.

What is Use_tz in Django?

When USE_TZ is False, this is the time zone in which Django will store all datetimes. When USE_TZ is True, this is the default time zone that Django will use to display datetimes in templates and to interpret datetimes entered in forms. ... When django rest framework takes the naive datetime data from request.


2 Answers

Update, January 2013: Django 1.4 now has time zone support!!


Old answer for historical reasons:

I'm going to be working on this problem myself for my application. My first approach to this problem would be to go with django core developer Malcom Tredinnick's advice in this django-user's post. You'll want to store the user's timezone setting in their user profile, probably.

I would also highly encourage you to look into the pytz module, which makes working with timezones less painful. For the front end, I created a "timezone picker" based on the common timezones in pytz. I have one select box for the area, and another for the location (e.g. US/Central is rendered with two select boxes). It makes picking timezones slightly more convenient than wading through a list of 400+ choices.

like image 157
Brian Neal Avatar answered Oct 21 '22 07:10

Brian Neal


It's not that hard to write timezone aware code in django:

I've written simple django application which helps handle timezones issue in django projects: https://github.com/paluh/django-tz. It's based on Brosner (django-timezone) code but takes different approach to solve the problem - I think it implements something similar to yours and FernandoEscher propositions.

All datetime values are stored in data base in one timezone (according to TIME_ZONE setting) and conversion to appropriate value (i.e. user timezone) are done in templates and forms (there is form widget for datetimes fields which contains additional subwidget with timezone). Every datetime conversion is explicit - no magic.

Additionally there is per thread cache which allows you simplify these datatime conversions (implementation is based on django i18n translation machinery).

When you want to remember user timezone, you should add timezone field to profile model and write simple middleware (follow the example from doc).

like image 26
paluh Avatar answered Oct 21 '22 05:10

paluh