Вопрос по timezone, python – Преобразование часового пояса Python

49

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

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

Ваш Ответ

7   ответов
68

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

Тогда вы можете использовать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")
Спасибо, я отредактировал ответ.
будьте осторожны, местное время может быть неоднозначным, и данная строка может не соответствовать какому-либо существующему времени, например, из-за переходов DST. Предоставлятьlocalize(is_dst=None) если вы хотите поднять исключение в таких случаях.
Обновлен код (python 3, часовые пояса).
4

Обратите внимание: первая часть этого ответа - маятник версии 1.x. Ниже приведен ответ для версии 2.x.

Надеюсь, я еще не поздно!

маятник библиотека выделяется в этом и других вычислениях даты и времени.

>>> 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.)

Для версии 2:

  • some_time_zones is a list of the names of the time zones that might be used in a program
  • heres_a_time is a sample time, complete with a time zone in the form '-0400'
  • I begin by converting the time to a pendulum time for subsequent processing
  • now I can show what this time is in each of the time zones in show_time_zones

...

>>> 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.from_format('1996-03-25 12:03 -0400', 'YYYY-MM-DD hh:mm ZZ')
>>> for tz in some_time_zones:
...     tz, pendulum_time.in_tz(tz)
...     
('Europe/Paris', DateTime(1996, 3, 25, 17, 3, 0, tzinfo=Timezone('Europe/Paris')))
('Europe/Moscow', DateTime(1996, 3, 25, 19, 3, 0, tzinfo=Timezone('Europe/Moscow')))
('America/Toronto', DateTime(1996, 3, 25, 11, 3, 0, tzinfo=Timezone('America/Toronto')))
('UTC', DateTime(1996, 3, 25, 16, 3, 0, tzinfo=Timezone('UTC')))
('Canada/Pacific', DateTime(1996, 3, 25, 8, 3, 0, tzinfo=Timezone('Canada/Pacific')))
('Asia/Macao', DateTime(1996, 3, 26, 0, 3, 0, tzinfo=Timezone('Asia/Macao')))
Маятник потрясающий, но имейте в виду, что вывод может быть несовместим с тем, что вы хотите делать дальше, например, с кадрами данных Pandas.
AttributeError: «функция»; объект не имеет атрибута "strptime"
@ Сетконнелл: Пожалуйста, смотрите редактировать.
6

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

time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone)

Даноaware_dt (а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}}")

If f"" syntax is unavailable, you could replace it with "".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: Как вы конвертируете дату / время из одного часового пояса в другой?

2

Для Python 3.2+простая дата это обертка вокруг pytz, которая пытается упростить вещи

Если у тебя естьtime затем

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

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

40

С помощью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)
@jfs Ах, я неправильно понял ваш комментарий! Я думал, что вы утверждаете, что моменты представляют собой совершенно разные моменты времени (то есть с интервалом в несколько часов), а не только то, что они были разделены несколькими микросекундами междуdatetime.now(...) звонки.
@jfs Нет, это не так - я просто запустил это, и он напечатал2018-07-12 13:46:17 UTC+0000, 2018-07-12 06:46:17 PDT-0700, а также2018-07-12 15:46:17 CEST+0200все из которых представляют один и тот же момент времени.
@MarkAmery: попробуйте добавить микросекунды кfmt ("%f") чтобы увидеть, что экземпляры времени разные.
примечание: печатаетdifferent моменты времени вdifferent часовые пояса. ОП спрашивает оthe same момент времени в разных часовых поясах.
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: date time string
  • tz1: initial time zone
  • tz2: target time zone

-

> 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']
4

Для преобразования часового пояса Python я используюудобный стол с PyCon 2012презентация Таави Бернс.

Похожие вопросы