Django 1.4: Swatting Those Pesky DST Bugs
Twice a year most of us have to deal with springing forward then falling back when daylight savings time (DST) kicks in and out. Our web apps need to deal with it too, but on some platforms the transition introduces pesky bugs that are hard to replicate and kill.
With the latest release of Django 1.4, the twice-a-year change doesn't have to be a frustrating bug search. Support for time zones now allows web apps to be aware of their time zone and make adjustments appropriately (finally!). Here's what the release notes say about time zone implementation in 1.4:
- The database now stores date and time in UTC
- Support for internal time zone aware objects
- Translations are made to display the proper time to the user
This welcome change though, introduces issues for some users that have legacy projects relying on naive (time zone agnostic) datetime objects. If you're using a PostgreSQL database then you're probably all set. Dates and times are already stored in a fashion that converts them to Coordinated Universal Time (UTC) which is the time standard used around the world. If you're using any other database however, you'll need to take some steps to ensure that your code functions properly once you turn on support for time zones.
The migration guide outlines three steps to bring code using naive datetime objects to full functionality:
- Add "USE_TZ = True" to your settings file (also install pytz, the Python World Time Zone Definitions)
- Refactor the code to make datatime objects aware (vs. naive)
- Use the warnings generated for naive datetime objects to create exceptions that allow you to traceback in the code where the objects are
To help in refactoring the code you can use django.utils.timezone. This set of functions helps create compatible code:
- now()
- is_aware()
- is_naive()
- make_aware()
- make_naive()
If you haven't started migrating yet, take a few minutes to look at the 1.4 FAQ and migration guide on djangoproject.com. You'll be glad you did when you start falling back November 4th.
Archives:
- April 2022 (1)
- April 2021 (1)
- February 2021 (1)
- January 2021 (2)
- December 2020 (1)
- January 2020 (2)
- October 2019 (1)
- September 2019 (1)
- August 2019 (1)
- July 2019 (1)