Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting UTC datetime to user's local date and time

I'm using python on Django and Google App Engine. I'm also using the DateTimeProperty in one of my models. Occasionally I would like to display that date and time to the user.

What is the best to convert the datetime stored in DateTimeProperty into the user's datetime?

Or a more precise way of framing the question: What is the best way to get a client's timezone and convert a python datetime object into their own local time?

like image 944
speedplane Avatar asked Nov 06 '10 21:11

speedplane


1 Answers

This is more a Python question, than a GAE one, unless GAE has some infrastructure to facilitate this (I've made a quick scan but haven't found any reference).

Basically, you want to store date/times in UTC timezone (e.g. use datetime.datetime.utcnow) along with user timezones, which you can either try to extract from user IPs (using GeoDjango, if avaiable on GAE, or pygeoip; you need some geolocation db like: http://www.maxmind.com/app/geolitecity), or to explicitly ask users about it - which has the advantage that you can ask for a descriptive timezone name, like "Europe/Warsaw". If you ask for just UTC+2, then you loose any indication of DST shifts.

Then, you can shift from utc to the desired timezone using e.g. pytz:

import pytz
local_tz = pytz.timezone(timezone_name)
return timestamp_utc.replace(tzinfo=pytz.utc).astimezone(local_tz).replace(tzinfo=None)

-- where timestamp_utc is utc datetime that you want to convert, and timezone_name is the mentioned "Europe/Warsaw".

(Note that I don't know which of these works in GAE, but at least you will know what to look for)

like image 91
Tomasz Zieliński Avatar answered Nov 02 '22 20:11

Tomasz Zieliński