Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: How do you convert a datetime/timestamp from one timezone to another timezone?

Specifically, given the timezone of my server (system time perspective) and a timezone input, how do I calculate the system time as if it were in that new timezone (regardless of daylight savings, etc)?

import datetime current_time = datetime.datetime.now() #system time  server_timezone = "US/Eastern" new_timezone = "US/Pacific"  current_time_in_new_timezone = ??? 
like image 794
kfan Avatar asked Aug 13 '15 00:08

kfan


People also ask

How do I convert datetime to another time zone?

When you send the database time to user, convert it to the correct timezone using timeInfo . DateTime userTime = TimeZoneInfo. ConvertTimeFromUtc(dbDateTime, timeInfo);

How do you convert datetime to UTC time in Python?

Use the pytz module, which comes with a full list of time zones + UTC. Figure out what the local timezone is, construct a timezone object from it, and manipulate and attach it to the naive datetime. Finally, use datetime. astimezone() method to convert the datetime to UTC.

How do I convert a timestamp to UTC?

Getting the UTC timestamp Use the datetime. datetime. now() to get the current date and time. Then use tzinfo class to convert our datetime to UTC.


1 Answers

If you know your origin timezone and the new timezone that you want to convert it to, it turns out to be very straightforward:

  1. Make two pytz.timezone objects, one for the current timezone and one for the new timezone e.g. pytz.timezone("US/Pacific"). You can find a list of all official timezones in pytz library: import pytz; pytz.all_timezones

  2. Localize the datetime/timestamp of interest to the current timezone e.g.

current_timezone = pytz.timezone("US/Eastern") localized_timestamp = current_timezone.localize(timestamp) 
  1. Convert to new timezone using .astimezone() on the newly localized datetime/timestamp from step 2 with the desired timezone's pytz object as input e.g. localized_timestamp.astimezone(new_timezone).

Done!

As a full example:

import datetime import pytz  # a timestamp I'd like to convert my_timestamp = datetime.datetime.now()  # create both timezone objects old_timezone = pytz.timezone("US/Eastern") new_timezone = pytz.timezone("US/Pacific")  # two-step process localized_timestamp = old_timezone.localize(my_timestamp) new_timezone_timestamp = localized_timestamp.astimezone(new_timezone)  # or alternatively, as an one-liner new_timezone_timestamp = old_timezone.localize(my_timestamp).astimezone(new_timezone)  

Bonus: but if all you need is the current time in a specific timezone, you can conveniently pass that timezone directly into datetime.now() to get the current times directly:

datetime.datetime.now(new_timezone) 

When it comes to needing timezones conversions generally, I would strongly advise that one should store all timestamps in your database in UTC, which has no daylight savings time (DST) transition. And as a good practice, one should always choose to enable time zone support (even if your users are all in a single time zone!). This will help you avoid the DST transition problem that plagues so much software today.

Beyond DST, time in software can be generally quite tricky. To get a sense of just how difficult it is to deal with time in software in general, here is a potentially enlightening resource: http://yourcalendricalfallacyis.com

Even a seemingly simple operation as converting a datetime/timestamp into a date can become non-obvious. As this helpful documentation points out:

A datetime represents a point in time. It’s absolute: it doesn’t depend on anything. On the contrary, a date is a calendaring concept. It’s a period of time whose bounds depend on the time zone in which the date is considered. As you can see, these two concepts are fundamentally different.

Understanding this difference is a key step towards avoiding time-based bugs. Good luck.

like image 152
kfan Avatar answered Sep 22 '22 20:09

kfan