Рубрики
Без рубрики

Как обрабатывать различия часовых поясов в Python

Обзор статьи: В предыдущем посте мы обсудили модуль DateTime в Python и использовали его для итерации через диапазон дат. Сегодня давайте узнаем, как управлять часовыми поясами в Python, используя модуль DateTime и сторонним пакетом, называемым Dateutil. Я стремлюсь выбрать целый ряд городов мира и распечатать местный … Как обрабатывать различия часовыхзонов в Python Подробнее »

Автор оригинала: David Yeoman.

Обзор статьи: В предыдущем посте Мы обсудили datetime Модуль в Python и использовал его для итерации через диапазон дат. Сегодня давайте узнаем, как управлять часовыми поясами в Python, используя datetime Модуль и сторонний пакет под названием DateutiL Отказ Я стремлюсь выбрать ряд мировых городов и напечатал местное время в каждом из этих городов. Я также напечатаю свое местное время и UTC или согласовал всеобщее время. Если вы не использовали datetime Модуль раньше, я предлагаю быструю Обзор этого поста перед продолжением.

Модуль Python DateTime и пакет DateutiL

Модуль Python DateTime резко облегчает кодирующие сложности при работе с часовыми поясами и прыжковыми годами. Три наиболее распространенные классы модуля DateTime являются:

datetime.date ()

Этот класс использует Gregorian Calendar, который начал в 1582 году после небольшой корректировки к календарю Julian. Тем не менее, datetime.date () Предполагается, что Грегорианский календарь бесконечно простирается в прошлое и будущее, и он принимает атрибуты, год, месяц и день.

datetime.time ()

Этот класс не зависит от какого-либо конкретного дня и предполагает, что день состоит из 24 х 60 х 60 секунд и игнорирует скачок секунды. Он принимает атрибуты, час, минуту, вторую, микросекунду, и информацию о часовом поясе, сокращенные до Tzinfo Отказ

datetime.dateTime ()

Этот класс является комбинацией двух классов выше и использует одни и те же атрибуты обоих.

Сегодня мы будем использовать только datetime () класс от datetime модуль.

Однако мы введем некоторые большие функциональные возможности с помощью пакета под названием DateutiL сторонний пакет, который добавляет мощность и утилиту к стандарту datetime Модуль в Python. Если у вас нет DateutiL Установлен, вы можете сделать это со следующей командой:

pip install python-dateutil

DateutiL имеет несколько модулей; Тем не менее, сегодня мы будем использовать TZ Модуль, позволяющий реализацию часового пояса с помощью информации из datetime.tzinfo () класс. Если вы хотите узнать больше о DateutiL пакет, Вы можете найти это здесь Отказ

Ваши темы знают или наивно?

Когда мы говорим о том, что кто-то наивен на английском языке, мы обычно имеем в виду, что им не хватает сложности, просты или невиновны. В Python мы различаем даты и времена наивывыми или осознающими, что означает, что наивная дата или временная экземпляра не содержит информацию о часовой зоне, в то время как осознает.

Документация Python утверждает, что знакомый дата или временной экземпляр является определенным моментом времени, не открытым для интерпретации, и он может находить себя в отношении других знакомых дат или объектов времени. Если бы я сделал арифметику с осознанием дат или раз из разных часовых поясов, Python обеспечит правильный интервал времени. Если я попробовал это с наивным объектом, это вернется неверная информация.

По этой причине мы используем datetime Объекты, которые содержат атрибут, называемый Tzinfo или информация о часовой поясе, которая создает осознание. TZINFO зафиксирует информацию о смещении от UTC, имена часовых поясов, и действует ли летнее время.

Давайте напишем какой-нибудь код!

Начнем с импорта datetime модуль, а затем TZ Модуль из DateutiL упаковка. Как мы кодируем, я введем, использую и объясню несколько классов, найденных в TZ модуль. Тогда мы найдем текущее UTC или время в нуле градусов долготы.

from datetime import datetime as dt
from dateutil.tz import *

print(dt.now(tzlocal()))

# Result
# 2021-05-13 16:51:04.250732+01:00

В этом коде мы импортировали datetime класс от datetime Модуль, и мы дали ему псевдоним DT Просто чтобы сэкономить меня, написание класса OUT Longhand каждый раз. Затем мы использовали звездочка Обозначение для импорта всех классов TZ модуль, который формирует часть DateutiL упаковка.

Я позвонил сейчас () Метод, который образует часть datetime модуль. сейчас () Метод возвращает текущую дату и время компьютерной системы во время выполнения оператора ныне. Тем не менее, мы передали на сейчас Метод метода tzlocal () который находится в TZ Модуль и возвращает информацию о часовой зоне или Tzinfo Отказ Это дает доступ к часовой и летней информации, необходимой для создания datetime Объект осознает. Вы можете видеть возвращенное значение 16:51 во второй половине дня 13 мая 2021 года, а часовой пояс составляет +1 час от UTC. Теперь мы увидим, сколько времени на ноль градуса долгота, призывая к текущей UTC.

from datetime import datetime as dt
from dateutil.tz import *

print(dt.now(tzlocal()), '\n')
print(dt.now(tzutc()))

# Result
# 2021-05-13 17:01:16.626317+01:00
# 2021-05-13 16:01:16.627316+00:00

Здесь мы ввели еще один метод от даты TZ Модуль, который называется tzutc () Отказ Как вы ожидаете, это возвращает осознание datetime Экземпляр в UTC datetime.now () Отказ Итак, вы видите свое время в Лондоне, который 17:01 GMT летнее время, а время в UTC, который составляет 16:01 UTC.

Успех – но не так читабельно

Мы достигли результата, но это не так удобно. Я собираюсь отформатировать вывод из этих двух строк кода, чтобы дать часовую точку, и мы тогда отформатируем вывод, чтобы быть более читаемым.

from datetime import datetime as dt
from dateutil.tz import *

local = dt.now(tzlocal()).tzname()
print('London: ', dt.now(tzlocal()), local, '\n')

utc = dt.now(tzutc()).tzname()
print('UTC: ', '\t', dt.now(tzutc()), utc)

# Result
# London:  	2021-05-13 17:22:29.135941+01:00 GMT Summer Time
# UTC:  	2021-05-13 16:22:29.135941+00:00 UTC

Есть несколько вещей, происходящих в этом последнем бит кода. Давайте отсикю это. Я представил новый метод от вентиляции TZ Модуль, называемый TZNAME () Отказ Этот метод возвращает имя часовой зоны из datetime Экземпляры для моего времени и времени UTC, и я передал его двум переменным, локальным и UTC соответственно. Тогда в Печать Линия, я просто называл переменной после datetime Экземпляр, чтобы распечатать информацию о часовой поясе. Конечно, я поставил имя города или зоны аванс в виде строки для повышения читаемости.

Так что читабельность улучшается, но мы можем сделать больше. Давайте отформатим вывод datetime Экземпляр быть более человеческими дружелюбным.

from datetime import datetime as dt
from dateutil.tz import *

local = dt.now(tzlocal()).tzname()
lon = dt.now(tzlocal())
print('London: ', lon.strftime('%A %d %b %Y  %H:%M hrs'), local, '\n')

utc = dt.now(tzutc()).tzname()
base = dt.now(tzutc())
print('UTC: ', '\t', base.strftime('%A %d %b %Y  %H:%M hrs'), utc)

# Result
# London:  	Thursday 13 May 2021  17:38 hrs GMT Summer Time
# UTC:  	Thursday 13 May 2021  16:38 hrs UTC

Теперь это огромное улучшение. В этом коде я представил strftime () Метод от datetime модуль. Этот метод делает строковый формат на datetime экземпляр, отсюда и название. Я создал datetime экземпляр для каждого местоположения и передал его в переменные линь и база , соответственно. Я тогда называл datetime экземпляр с использованием . strftime () и использовали определенные коды в строке для форматирования возврата данных. Для полного списка кодов Перейти на этот сайт Отказ Чтобы объяснить те, которые мы использовали, вот список:

%A Недели как полное имя локали. четверг
%d День месяца как нулевой десятичный номер. 13
%B Месяц как полное имя локали. Может
%Y Год с веком как десятичное число. 2021
%H Час (24-часовые часы) в качестве нулевого десятичного числа. 16
%-M Минута как десятичное число. (Конкретная платформа) 38

Теперь у нас есть читаемый формат, предоставляя всю необходимую информацию, мы можем добавить в эти другие города, в которых мы хотим знать время. Вот последний бит кода с некоторой реконфигурированием и некоторыми новыми методами.

from datetime import datetime as dt
from dateutil.tz import *

utc = dt.now(tzutc()).tzname()
base = dt.now(tzutc())
print('UTC: ', '\t\t\t\t', base.strftime('%A %d %b %Y  %H:%M hrs'), utc, '\n')

print('East of UTC', '\n')

local = dt.now(tzlocal()).tzname()
lon = dt.now(tzlocal())
print('London: ', '\t\t\t', lon.strftime('%A %d %b %Y  %H:%M hrs'), local)

jburg = dt.now(tzoffset('SAST', 7200))
sa = dt.tzname(jburg)
print('Johannesburg: ', '\t\t', jburg.strftime('%A %d %b %Y  %H:%M hrs'), sa)

tokyo = dt.now(tzoffset('JST', 32400))
jp = dt.tzname(tokyo)
print('Tokyo: ', '\t\t\t', tokyo.strftime('%A %d %b %Y  %H:%M hrs'), jp)

kiri = dt.now(tzoffset('LINT', 50400))
ci = dt.tzname(kiri)
print('Kiribati: ', '\t\t\t', kiri.strftime('%A %d %b %Y  %H:%M hrs'), ci, '\n')

print('West of UTC', '\n')

wash_dc = dt.now(tzoffset('EDT', -14400))
us = dt.tzname(wash_dc)
print('Panama: ', '\t\t\t', wash_dc.strftime('%A %d %b %Y  %H:%M hrs'), us)

pana = dt.now(tzoffset('PAB', -18000))
pan = dt.tzname(pana)
print('Washington DC: ', '\t', pana.strftime('%A %d %b %Y  %H:%M hrs'), pan)

ckt = dt.now(tzoffset('CKT', -36000))
rar = dt.tzname(ckt)
print('Rarotonga: ', '\t\t', ckt.strftime('%A %d %b %Y  %H:%M hrs'), rar)

alo = dt.now(tzoffset('NUT', -39600))
nut = dt.tzname(alo)
print('Niue: ', '\t\t\t\t', alo.strftime('%A %d %b %Y  %H:%M hrs'), nut)

Выход:

# Result

UTC:  			Friday 14 May 2021  10:34 hrs UTC

East of UTC

London:  		Friday 14 May 2021  11:34 hrs GMT Summer Time
Johannesburg:  	Friday 14 May 2021  12:34 hrs SAST
Tokyo:  		Friday 14 May 2021  19:34 hrs JST
Kiribati:  		Saturday 15 May 2021  00:34 hrs LINT

West of UTC

Panama:  		Friday 14 May 2021  06:34 hrs EDT
Washington DC:  	Friday 14 May 2021  05:34 hrs PAB
Rarotonga:  		Friday 14 May 2021  00:34 hrs CKT
Niue:  			Thursday 13 May 2021  23:34 hrs NUT

В этом коде я представил другой метод TZ класс, который есть Tzoffset () Отказ С Tzoffset () Вы проходите два атрибута, имя часового пояса и смещения в секундах от UTC. Обратите внимание, что для часовых поясов к западу от UTC номер смещения положительный; Это негативно для этих восток UTC. Я нахожу Мировой сайт часов Быть полезным для получения информации о времени, дате и аббревиатуре.

В итоге

В этой статье мы представили datetime Модуль в Python и сторонний пакет Датеэтилс . Мы стремились выработать список раз в выбранных городах мира по сравнению с UTC и нашим местным временем.

Мы узнали о dateTime.dateTime () Класс в Python и TZ класс в Датеэтилс . Мы также смотрели на наивных и знаем datetime экземпляры.

Классы, которые мы использовали:

datetime.now () Возвращает текущую дату и время компьютерной системы во время выполнения оператора ныне.
tz.local () Возвращает информацию о часовой поясе или TZINFO.
TZ.UTC () Возвращает экземпляр Aware DateTime в UTC
TZ.name () Возвращает имя часового пояса из экземпляра DateTime
tz.offset () Принимает два атрибута; Имя часового пояса и его смещение за считанные секунды от UTC
strftime () Строковый формат в экземпляре DateTime из введенных кодов

Наконец, мы производим список избранных городов по всему миру и печатные отформатированные даты и времена, с добавлением их часового пояса.

Я доверяю, эта статья была полезна для вас. Спасибо за прочтение.

Оригинал: “https://blog.finxter.com/dealing-with-timezone-differences-in-python/”