Если вы знаете свой исходный часовой пояс и новый часовой пояс, в который хотите его преобразовать, все оказывается очень просто:
Создайте два объекта pytz.timezone
, один для текущего часового пояса и один для нового часового пояса, например. pytz.timezone("US/Pacific")
. Вы можете найти список всех официальных часовых поясов в pytz
библиотеке: import pytz; pytz.all_timezones
Локализуйте интересующую дату и время/временную метку для текущего часового пояса, например.
current_timezone = pytz.timezone("US/Eastern")
localized_timestamp = current_timezone.localize(timestamp)
- Преобразуйте в новый часовой пояс, используя
.astimezone()
для новой локализованной даты и времени/временной метки из шага 2 с требуемым объектом pytz часового пояса в качестве входных данных, например. localized_timestamp.astimezone(new_timezone)
.
Сделанный!
В качестве полного примера:
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)
Бонус: но если все, что вам нужно, это текущее время в определенном часовом поясе, вы можете удобно передать этот часовой пояс непосредственно в datetime.now(), чтобы получить текущее время напрямую:
datetime.datetime.now(new_timezone)
Когда дело доходит до необходимости преобразования часовых поясов в целом, я настоятельно рекомендую хранить все временные метки в вашей базе данных в формате UTC, который не имеет перехода на летнее время (DST). И в качестве хорошей практики всегда следует включать поддержку часовых поясов (даже если все ваши пользователи находятся в одном часовом поясе!). Это поможет вам избежать проблем с переходом на летнее время, от которых сегодня страдает так много программного обеспечения.
Помимо летнего времени, время в программном обеспечении может быть довольно сложным. Чтобы понять, насколько сложно иметь дело со временем в программном обеспечении вообще, вот потенциально полезный ресурс: http://yourcalendricalfallacyis.com
Даже такая, казалось бы, простая операция, как преобразование даты и времени/временной метки в дату, может стать неочевидной. Как указано в этой полезной документации:
Datetime представляет момент времени. Он абсолютен: он ни от чего не зависит. Напротив, дата — это концепция календаря. Это период времени, границы которого зависят от часового пояса, в котором считается дата. Как видите, эти два понятия принципиально разные.
Понимание этой разницы — ключевой шаг к тому, чтобы избежать ошибок, связанных со временем. Удачи.
person
kfan
schedule
13.08.2015