Автор оригинала: 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/”