["python","datetime","utc","localtime"]
Convert UTC datetime string to local datetime

I've never had to convert time to and from UTC. Recently had a request to have my app be timezone aware, and I've been running myself in circles. Lots of information on converting local time to UTC, which I found fairly elementary (maybe I'm doing that wrong as well), but I can not find any information on easily converting the UTC time to the end-users timezone. In a nutshell, and android app sends me (appengine app) data and within that data is a timestamp. To store that timestamp to utc time I am using: datetime.utcfromtimestamp(timestamp) That seems to be working. When my app stores the data, it is being store as 5 hours ahead (I am EST -5) The data is being stored on appengine's BigTable, and when retrieved it comes out as a string like so: "2011-01-21 02:37:21" How do I convert this string to a DateTime in the users correct time zone? Also, what is the recommended storage for a users timezone information? (How do you typically store tz info ie: "-5:00" or "EST" etc etc ?) I'm sure the answer to my first question might contain a parameter the answers the second.
If you don't want to provide your own tzinfo objects, check out the python-dateutil library. It provides tzinfo implementations on top of a zoneinfo (Olson) database such that you can refer to time zone rules by a somewhat canonical name. from datetime import datetime from dateutil import tz # METHOD 1: Hardcode zones: from_zone = tz.gettz('UTC') to_zone = tz.gettz('America/New_York') # METHOD 2: Auto-detect zones: from_zone = tz.tzutc() to_zone = tz.tzlocal() # Since datetime.utcnow() is deprecated since version 3.12 use datetime.now() # utc = datetime.now() utc = datetime.strptime('2011-01-21 02:37:21', '%Y-%m-%d %H:%M:%S') # Tell the datetime object that it's in UTC time zone since # datetime objects are 'naive' by default utc = utc.replace(tzinfo=from_zone) # Convert time zone central = utc.astimezone(to_zone) Edit Expanded example to show strptime usage Edit 2 Fixed API usage to show better entry point method Edit 3 Included auto-detect methods for timezones (Yarin)