2012-06-12 2 views
37

Ищу быстрый способ ввести время, а затем питон преобразовать его в другие часовые пояса (возможно, до 10 различных часовых поясов)Python Timezone преобразования

Sorry. Я вообще не знаком со временем в питоне, если кто-то может поставить меня в правильном направлении, я бы очень признателен.

ответ

38

Использование 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) 
+8

примечание: оно печатает * разные * моменты времени в * разных * часовых поясах. OP запрашивает ** тот же ** момент времени в разных часовых поясах. – jfs

49

Я нашел, что наилучшим подходом является преобразование «момента», представляющего интерес для объекта datetime, поддерживающего utc-timezone (в python компонент часового пояса не требуется для объектов datetime).

Затем вы можете использовать astimezone для преобразования в интересующий вас временной пояс (reference).

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 

Таким образом, с момента интерес к местному часовому поясу (время, которое exists), вы преобразовать его в UTC, как это (reference).

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") 
+6

будьте осторожны, местное время может быть неоднозначным, и данная строка может не соответствовать какому-либо существующему времени, например, из-за перехода DST. Предоставьте 'localize (is_dst = None)', если вы хотите создать исключение в таких случаях. – jfs

+0

Спасибо, я отредактировал ответ. – juan

+0

Обновлен код (python 3, timezones). – juan

2

Для Python 3.2+ simple-date является оберткой pytz, который пытается упростить вещи.

Если у вас есть time то

SimpleDate(time).convert(tz="...") 

может делать то, что вы хотите. Но часовые пояса - довольно сложные вещи, поэтому они могут значительно усложняться - см. the docs.

5

Для преобразования времени в одном часовом поясе, на другой часовой пояс в Python, вы могли бы use datetime.astimezone():

time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone) 

Учитывая aware_dtdatetime объекта в некоторой временной зоне), чтобы преобразовать его в других часовые пояса и напечатать раз в заданном формате времени:

#!/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: How do you convert datetime/timestamp from one timezone to another timezone?

2
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'] 
0

Я надеюсь, что я не слишком поздно!

Библиотека 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]>) 

Answer перечисляет имена часовых поясов, которые могут быть использованы с маятником. (Они такие же, как для pytz.)

Смежные вопросы