Преобразование часового пояса Python
Я ищу быстрый способ ввода за раз, а затем python преобразует его в другие часовые пояса (возможно, до 10 разных часовых поясов)
К сожалению. Я не знаком со временем на питоне, если кто-то может поставить меня в правильном направлении, я бы очень признателен.
Ответы
Ответ 1
Я нашел, что наилучшим подходом является преобразование "момента", представляющего интерес для объекта datetime, поддерживающего utc-timezone (в python компонент временной зоны не требуется для datetime).
Затем вы можете использовать astimezone для преобразования в интересующий часовой пояс (ссылка).
from datetime import datetime
import pytz
utcmoment_naive = datetime.utcnow()
utcmoment = utcmoment_naive.replace(tzinfo=pytz.utc)
# print "utcmoment_naive: {0}".format(utcmoment_naive) # python 2
print("utcmoment_naive: {0}".format(utcmoment_naive))
print("utcmoment: {0}".format(utcmoment))
localFormat = "%Y-%m-%d %H:%M:%S"
timezones = ['America/Los_Angeles', 'Europe/Madrid', 'America/Puerto_Rico']
for tz in timezones:
localDatetime = utcmoment.astimezone(pytz.timezone(tz))
print(localDatetime.strftime(localFormat))
# utcmoment_naive: 2017-05-11 17:43:30.802644
# utcmoment: 2017-05-11 17:43:30.802644+00:00
# 2017-05-11 10:43:30
# 2017-05-11 19:43:30
# 2017-05-11 13:43:30
Итак, с интересом к местному часовому поясу (время существует), вы конвертируете его в utc, как это (ссылка).
localmoment_naive = datetime.strptime('2013-09-06 14:05:10', localFormat)
localtimezone = pytz.timezone('Australia/Adelaide')
try:
localmoment = localtimezone.localize(localmoment_naive, is_dst=None)
print("Time exists")
utcmoment = localmoment.astimezone(pytz.utc)
except pytz.exceptions.NonExistentTimeError as e:
print("NonExistentTimeError")
Ответ 2
Использование pytz
from datetime import datetime
from pytz import timezone
fmt = "%Y-%m-%d %H:%M:%S %Z%z"
timezonelist = ['UTC','US/Pacific','Europe/Berlin']
for zone in timezonelist:
now_time = datetime.now(timezone(zone))
print now_time.strftime(fmt)
Ответ 3
Чтобы преобразовать время в одном часовом поясе в другой часовой пояс в Python, вы можете использовать datetime.astimezone()
:
time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone)
Данный aware_dt
(a datetime
объект в некоторый часовой пояс), чтобы преобразовать его в другие временные зоны и распечатать время в заданном формате времени:
#!/usr/bin/env python3
import pytz # $ pip install pytz
time_format = "%Y-%m-%d %H:%M:%S%z"
tzids = ['Asia/Shanghai', 'Europe/London', 'America/New_York']
for tz in map(pytz.timezone, tzids):
time_in_tz = aware_dt.astimezone(tz)
print(f"{time_in_tz:{time_format}}")
Если синтаксис f""
недоступен, вы можете заменить его на "".format(**vars())
где вы можете установить aware_dt
из текущего времени в локальном часовом поясе:
from datetime import datetime
import tzlocal # $ pip install tzlocal
local_timezone = tzlocal.get_localzone()
aware_dt = datetime.now(local_timezone) # the current time
Или из строки времени ввода в локальном часовом поясе:
naive_dt = datetime.strptime(time_string, time_format)
aware_dt = local_timezone.localize(naive_dt, is_dst=None)
где time_string
может выглядеть так: '2016-11-19 02:21:42'
. Это соответствует time_format = '%Y-%m-%d %H:%M:%S'
.
is_dst=None
заставляет исключение, если строка времени ввода соответствует несуществующему или неоднозначному локальному времени, например, во время перехода на летнее время. Вы также можете пройти is_dst=False
, is_dst=True
. См. Ссылки с более подробной информацией на Python: как вы конвертируете datetime/timestamp из одного часового пояса в другой часовой пояс?
Ответ 4
Для конверсий часовых поясов Python я использую удобную таблицу из PyCon 2012 presentation от Taavi Burns.
Ответ 5
Для Python 3.2+ simple-date является оберткой вокруг pytz, которая пытается упростить вещи.
Если у вас есть time
, то
SimpleDate(time).convert(tz="...")
может делать то, что вы хотите. Но временные интервалы - довольно сложные вещи, поэтому они могут значительно усложняться - см. документы.
Ответ 6
import datetime
import pytz
def convert_datetime_timezone(dt, tz1, tz2):
tz1 = pytz.timezone(tz1)
tz2 = pytz.timezone(tz2)
dt = datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S")
dt = tz1.localize(dt)
dt = dt.astimezone(tz2)
dt = dt.strftime("%Y-%m-%d %H:%M:%S")
return dt
-
-
dt
: строка времени даты
-
tz1
: начальный часовой пояс
-
tz2
: целевой часовой пояс
-
> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "PST8PDT")
'2017-05-13 05:56:32'
> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "UTC")
'2017-05-13 12:56:32'
-
> pytz.all_timezones[0:10]
['Africa/Abidjan',
'Africa/Accra',
'Africa/Addis_Ababa',
'Africa/Algiers',
'Africa/Asmara',
'Africa/Asmera',
'Africa/Bamako',
'Africa/Bangui',
'Africa/Banjul',
'Africa/Bissau']
Ответ 7
Надеюсь, я не слишком поздно!
Библиотека pendulum выделяется при этом и в других вычислениях даты и времени.
>>> import pendulum
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao']
>>> heres_a_time = '1996-03-25 12:03 -0400'
>>> pendulum_time = pendulum.datetime.strptime(heres_a_time, '%Y-%m-%d %H:%M %z')
>>> for tz in some_time_zones:
... tz, pendulum_time.astimezone(tz)
...
('Europe/Paris', <Pendulum [1996-03-25T17:03:00+01:00]>)
('Europe/Moscow', <Pendulum [1996-03-25T19:03:00+03:00]>)
('America/Toronto', <Pendulum [1996-03-25T11:03:00-05:00]>)
('UTC', <Pendulum [1996-03-25T16:03:00+00:00]>)
('Canada/Pacific', <Pendulum [1996-03-25T08:03:00-08:00]>)
('Asia/Macao', <Pendulum [1996-03-26T00:03:00+08:00]>)
Отвечать перечислены имена часовых поясов, которые могут использоваться с маятником. (Они такие же, как и для pytz.)