okpython.net
Все для начинающих

Дата и время в Python

Основные понятия даты и времени

Довольно часто в программах на языке Python приходится манипулировать датой и временем, например, при выводе текущего времени в приложениях, вычислении временных промежутков, сохранении информации в базе данных, регистрации и обеспечении доступа пользователей к ресурсам и т. д. Для этих целей в Пайтоне предусмотрены модули стандартной библиотеки datetime, time и calendar, возможности которых мы и будем рассматривать в данном параграфе. Однако сперва давайте кратко рассмотрим несколько основных понятий, используемых в мировых стандартах, связанных с датой и временем.

Всемирное координированное время (от англ. Coordinated Universal Time, UTC) – это основной стандарт, по которому в мире регулируются часы и время. Перевод часов на зимнее и летнее время данным стандартом не предусмотрен.

Стандарт UTC возник из-за того, что среднее время по Гринвичу (GMT), т.е. среднее солнечное время нулевого меридиана, проходящего через прежнее место расположения Гринвичской королевской обсерватории около Лондона, неравномерно и связано с суточным вращением Земли, которое также неравномерно. В свою очередь, шкала UTC основана на равномерной шкале атомного времени и является более удобной для гражданского использования.

В настоящее время все часовые пояса определяются по их смещению относительно UTC, которое может быть нулевым, положительным или отрицательным. Так в Лондоне и некоторых других близлежащих городах смещение принимается равным нулю, т.е. они относятся к часовому поясу UTC+00:00. Минск и Москва, например, находятся в часовом поясе UTC+03:00, а Пекин в часовом поясе UTC+08:00. При этом переход на летнее время в этих городах не осуществляется, поэтому когда в Минске часы показывают 12 часов дня, в Пекине они показывают 17 часов вечера. В тоже время в Сальвадоре часы покажут 8 часов утра, ведь эта страна находится в часовом поясе UTC-03:00 (разница с Минском составляет 6 часов). Более того разница во времени может быть и не кратна целому количеству часов. Так в Тегеране часы покажут время 12 часов 30 минут, поскольку всемирное координированное время в данном районе установлено властями в UTC+03:30.

В некоторых странах несмотря на стандарт UTC используется переход на летнее время. В результате на летний период к стандартному времени прибавляется один час. Это делается для того, чтобы лучше использовать естественный свет и экономить электроэнергию. Однако летнее время применяется не во всех странах и, кроме того, не всегда совпадает по датам перевода часов. Поэтому, чтобы не запутаться во времени разных стран и регионов, рекомендуется использовать специальные карты часовых поясов или онлайн-сервисы, показывающие текущее время в любой точке мира.

Григорианский календарь – это система исчисления времени, которая основана на движении Земли вокруг Солнца. В этом календаре год состоит из 365 или 366 дней, если год является високосным. Високосные годы бывают каждые четыре года, исключая столетия, которые не делятся на 400 (например, 1600 и 2000 годы были високосными, а 1700, 1800 и 1900 годы високосными не были).

Григорианский календарь был введен в 1582 году папой римским Григорием XIII, чтобы исправить ошибку в юлианском календаре, который использовался до этого. Юлианский календарь был слишком длинным по сравнению с солнечным годом и поэтому нарушался порядок празднования Пасхи. В результате папа Григорий XIII решил отбросить 10 дней из календаря и ввести новые правила для високосных лет. Поэтому после 4 октября 1582 года сразу пошла дата 15 октября 1582 года.

Сейчас григорианский календарь является самым распространенным календарем в мире и используется для международной торговли, науки и общения. Его еще называют «новым стилем» по сравнению со «старым стилем» юлианского календаря.

Unix-время или временная метка Unix (от англ. Unix time) – это способ описания моментов во времени, который используется в Unix и других POSIX-совместимых операционных системах. Метка юникса показывает, сколько секунд прошло с полуночи 1 января 1970 года по всемирному координированному времени. Эта дата называется «эпохой Unix».

Метка Unix используется для хранения и обработки дат и времени почти во всех компьютерных системах, языках программирования и базах данных. Она может быть как положительной (время идет после эпохи юникса), так и отрицательной (время идет до эпохи юникса). Например, метка юникса 1627472400 соответствует дате и времени 28 июля 2021 года 12:00:00 по UTC. А вот отрицательная метка -31536000 (секунды отсчитываются в обратном направлении) соответствует 1 января 1969 года 00:00:00 по UTC.

Следует добавить, что в программах для хранения Unix-времени до некоторого момента использовались лишь 32-битные числа, которые давали возможность ссылаться на моменты времени от пятницы 13 декабря 1901 года 20:45:52 до вторника 19 января 2038 года 03:14:07 включительно. Теперь же все 64-битные операционные системы и подавляющая часть ПО стали использовать для работы 64-битные числа, что позволило расширить доступный для операций период времени до 292 млрд. лет.

Модуль datetime

Модуль datetime стандартной библиотеки Пайтона является основным инструментом для управления датой и временем. В частности мы можем:

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

Для реализации всех этих возможностей модуль предоставляет ряд классов и методов, подробно с которыми можно ознакомиться в разделе «datetime — Basic date and time types» стандартной библиотеки. Мы же пройдемся лишь по некоторым из них, чтобы получить более ясное представление о порядке работы с модулем.

Всего модуль datetime предлагает нам шесть основных классов и набор соответствующих им методов:

  • date – представляет собой дату на основе григорианского календаря, полностью игнорируя сведения о времени;
  • time – включает данные о времени, полностью игнорируя сведения о дате;
  • datetime – содержит информацию о времени и дате, основываясь на данных из григорианского календаря;
  • timedelta – предназначен для работы с интервалами дат и времени;
  • tzinfo – представляет различные сведения о часовом поясе;
  • timezone – предназначен для обработки времени по стандарту UTC.

Все перечисленные типы (классы) имеют следующие общие характеристики: объекты этих типов неизменяемы, хешируемы (а значит могут использоваться в качестве ключей словаря) и поддерживают сериализацию с помощью модуля pickle.

В общем случае для создания экземпляра класса datetime можно использовать конструктор datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0), в котором первые три параметра обязательны для передачи, а все последующие могут использоваться со значениями по умолчанию, включая именованный аргумент fold:

  • year – год в пределах datetime.MINYEAR ≤ year ≤ datetime.MAXYEAR, где константа datetime.MINYEAR равна 1, а datetime.MAXYEAR принимается равной 9999;
  • month – месяц в пределах 1 ≤ month ≤ 12;
  • day – день в пределах 1 ≤ day ≤ n_day, где n_day – количество дней в данном месяце заданного года;
  • hour=0 – часы в пределах 0 ≤ hour < 24;
  • minute=0 – минуты в пределах 0 ≤ minute < 60;
  • second=0 – секунды в пределах 0 ≤ second < 60;
  • microsecond=0 – микросекунды в пределах 0 ≤ microsecond < 1000 000;
  • tzinfo=None – экземпляр подкласса datetime.tzinfo (по умолчанию используется None);
  • fold=0 – флаг, сигнализирующий о летнем (0) или зимнем (1) времени.

После создания экземпляра класса все компоненты даты могут быть получены посредством соответствующих атрибутов, например, datetime_obj.year или datetime_obj.hour (см. пример №1).

Код Результат pythonCodes
# Импортируем класс datetime из одноименного модуля.
from datetime import datetime as dt
   
# 14.12.1503 - день рождения Нострадамуса.
# Создадим объект даты и времени для этого события.
date_and_time = dt(1503, 12, 14, 11, 1, 25)

# Получаем компоненты по отдельности.
year = date_and_time.year
month = date_and_time.month 
day = date_and_time.day 
hour = date_and_time.hour
minute = date_and_time.minute
second = date_and_time.second

# Выводим строковое представление объекта.
# Дата и время: 1503-12-14 11:01:25.
print('Дата и время:', date_and_time)
# Форматируем по-своему и выводим. 
d = '{}.{}.{}'.format(day, month, year)
# Дата: 14.12.1503.
print('Дата:', d)
t = '{}:0{}:{}'.format(hour, minute, second)
# Время: 11:01:25.
print('Время:', t)
Дата и время: 1503-12-14 11:01:25
Дата: 14.12.1503
Время: 11:01:25




















		
			

Пример №1. Использование модуля datetime (часть 1).

Объекты класса datetime могут быть созданы и при помощи соответствующих методов класса:

  • datetime.datetime.today() – возвращает текущую локальную дату и время (tzinfo=None);
  • datetime.datetime.now(tz=None) – возвращает текущую локальную дату и время;
  • datetime.datetime.utcnow() – возвращает текущую дату и время UTC (tzinfo=None);
  • datetime.datetime.fromtimestamp(timestamp, tz=None) – возвращает локальную дату и время, соответствующие метке времени POSIX time.time();
  • datetime.datetime.utcfromtimestamp(timestamp) – возвращает дату и время UTC, соответствующие метке времени POSIX (tzinfo=None);
  • datetime.datetime.combine(datetime.date, datetime.time, tzinfo=self.tzinfo) – возвращает новый объект datetime.datetime(), компоненты даты date которого соответствуют переданному объекту datetime.date, а компоненты времени time – переданному объекту datetime.time;
  • datetime.datetime.fromisoformat(date_string) – возвращает объект даты и времи datetime.datetime(), соответствующий строке date_string в любом допустимом формате ISO 8601, но со следующими исключениями:
    • смещение часового пояса может составлять доли секунды,
    • разделитель T может быть заменен любым символом Юникода,
    • отсутствует поддержка порядковых дат,
    • также не поддерживаются дробные часы и минуты;
  • datetime.datetime.fromisocalendar(year, week, day) – возвращает объект даты и времени, соответствующий календарной дате формата ISO 8601, указанной в атрибутах year, week, day (остальные компоненты datetime заполняются их обычными значениями по умолчанию);
Использование некоторых из этих методов класса показано в примере №2.

Код Результат pythonCodes
# Импортируем модуль time.
import time as tm
# Импортируем класс datetime из модуля datetime.
from datetime import datetime as dt
# Импортируем классы date, time, timezone.
from datetime import date, time, timezone  

# 2023-08-01 10:08:33.646700.
print(dt.today())
# 2023-08-01 10:08:33.646699.
print(dt.now(), end='\n\n')

# 2023-08-01 07:08:33.646699.
print(dt.utcnow())
# Рекомендуемый способ создания объекта c текущим временем 
# в UTC без смещения: 2023-08-01 07:08:33.646699+00:00.
print(dt.now(timezone.utc), end='\n\n')

# 2023-08-01 10:08:33.646699.
print(dt.fromtimestamp(tm.time()))
# 2023-08-01 07:08:33.646699+00:00.
print(dt.fromtimestamp(tm.time(), timezone.utc), end='\n\n')

# 1995-05-09 09:13:20 (800 млн. сек. с начала эпохи).
print(dt.fromtimestamp(800000000))
# 1998-07-09 16:00:00+00:00 (900 млн. сек. с начала эпохи).
print(dt.fromtimestamp(900000000, timezone.utc), end='\n\n')

# 2023-08-01 15:25:00.
print(dt.combine(date.today(), time(15, 25)), end='\n\n')

# Получаем экземпляры из строк в формате ISO 8601.
# 2023-08-01 00:00:00.
print(dt.fromisoformat('2023-08-01'))
# 2023-08-01 00:00:00.
print(dt.fromisoformat('20230801'))
# 2023-08-01 00:15:25+00:00.
print(dt.fromisoformat('2023-08-01T00:15:25Z'))
2023-08-01 10:08:33.646699
2023-08-01 10:08:33.646699

2023-08-01 07:08:33.646699
2023-08-01 07:08:33.646699+00:00

2023-08-01 10:08:33.646699
2023-08-01 07:08:33.646699+00:00

1995-05-09 09:13:20
1998-07-09 16:00:00+00:00

2023-08-01 15:25:00

2023-08-01 00:00:00
2023-08-01 00:00:00
2023-08-01 00:15:25+00:00



















		
			

Пример №2. Использование модуля datetime (часть 2).

Опять же, после создания экземпляра даты и времени доступ к его компонентам можно получить посредством соответствующих атрибутов. Кроме того, становится доступен и ряд методов для работы с данными объекта (см. пример №3):

  • date() – возвращает объект даты с теми же значениями атрибутов year, month и day;
  • time() – возвращает объект времени с теми же значениями атрибутов hour, minute, second, microsecond и fold (tzinfo устанавливается в None);
  • timetz() – возвращает объект времени с теми же значениями атрибутов hour, minute, second, microsecond, fold и tzinfo;
  • replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, *, fold=0) – возвращает новый объект datetime.datetime() с теми же атрибутами, за исключением тех, для которых были переданы новые значения;
  • timetuple() – возвращает именованный кортеж структуры времени time.struct_time, в котором содержатся компоненты даты и времени, которые доступны по именам tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec, tm_wday, tm_yday, tm_isdst;
  • timestamp() – возвращает метку времени POSIX (число с плавающей точкой, аналогичное тому, которое возвращает time.time()), соответствующую экземпляру datetime.datetime();
  • ctime() – возвращает строку, представляющую дату и время;
  • strftime(format) – возвращает строку, представляющую дату и время, форматируемую согласно строковому параметру format (порядок работы с методом см. в справочнике).

Код Результат pythonCodes
# Импортируем класс datetime из модуля.
from datetime import datetime as dt
 
# Получаем экземпляр текущего времени.
cur_dt = dt.now()
# Выводим строковые представления объектов.
# Дата и время: 2023-09-03 16:53:37.515892.
print('Дата и время:', cur_dt)
# Дата: 2023-09-03.
print('Дата:', cur_dt.date())
# Время: 16:53:37.515892.
print('Время:', cur_dt.time(), end='\n\n')

# Опять же, получаем компоненты по отдельности, 
# использовав атрибуты полученного экземпляра.
year = cur_dt.year
month = cur_dt.month 
day = cur_dt.day 
hour = cur_dt.hour
minute = cur_dt.minute
second = cur_dt.second
# Форматируем по-своему и выводим. 
d_1 = '0{}.0{}.{}'.format(day, month, year)
# Дата: 03.09.2023.
print('Дата:', d_1)
t_1 = '{}:{}:{}'.format(hour, minute, second)
# Время: 16:53:37. 
print('Время:', t_1, end='\n\n')

# Также можно получить все компоненты в виде именованного кортежа:
# time.struct_time(tm_year=2023, tm_mon=9, tm_mday=3, tm_hour=16, 
# tm_min=53, tm_sec=37, tm_wday=6, tm_yday=246, tm_isdst=-1).
tm_tpl = cur_dt.timetuple()
# Форматируем по-своему и выводим. 
d_2 = '0{}.0{}.{}'.format(tm_tpl.tm_mday, tm_tpl.tm_mon, tm_tpl.tm_year)
# Дата: 03.09.2023.
print('Дата:', d_2)
t_2 = '{}:{}:{}'.format(tm_tpl.tm_hour, tm_tpl.tm_min, tm_tpl.tm_sec)
# Время: 16:53:37.
print('Время:', t_2, end='\n\n')

# Прошло секунд с начала Эпохи Unix: 1693749217.515892.
# Почти 1.7 млрд. секунд! 
print(cur_dt.timestamp())
# Sun Sep  3 16:53:37 2023 (в виде отформатированной строки).
print(cur_dt.ctime(), end='\n\n')

# 16 часов 53 минут 03.09.2023 года.
print(cur_dt.strftime('%H часов %M минут %d.%m.%Y года'))
# 03.09.2023.
print(cur_dt.strftime('%d.%m.%Y'), end='\n\n')

# Изменили на 2020-07-03 10:53:37.515892.
print(cur_dt.replace(year=2020, month=7, hour=10))
Дата и время: 2023-09-03 16:53:37.515892
Дата: 2023-09-03
Время: 16:53:37.515892

Дата: 03.09.2023
Время: 16:53:37

Дата: 03.09.2023
Время: 16:53:37

1693749217.515892
Sun Sep  3 16:53:37 2023

16 часов 53 минут 03.09.2023 года
03.09.2023

2020-07-03 10:53:37.515892



































		
			

Пример №3. Использование модуля datetime (часть 3).

Здесь мы перечислили далеко не все методы, доступные экземплярам класса datetime.datetime, поэтому обязательно посетите справочник и хотя бы бегло ознакомьтесь с документацией. Это касается и классов datetime.date (работа только с датами) и datetime.time (работа только со временем), поскольку принцип работы с ними не сильно отличается от порядка использования более общего класса datetime.datetime.

Стоит добавить, что для экземпляров классов datetime.datetime и datetime.date дополнительно предусмотрена возможность осуществления операций сложения, вычитания и сравнения. При чем в операциях сложения и вычитания могут участвовать еще и экземпляры класса datetime.timedelta, представляющего временные интервалы (см. пример №4).

Код Результат pythonCodes
# Импортируем класс datetime из модуля datetime.
from datetime import datetime as dt
# Импортируем класс timedelta из модуля datetime.
from datetime import timedelta as tdl
 
# Создаем экземпляр даты для нового 2024 года.
new_year_dt = dt(2024, 1, 1, 0, 0, 0)
# Получаем экземпляр текущего времени.
cur_dt = dt.today()

# Узнаем дату через 17 дней и 3 недели.
next_dt = cur_dt + tdl(days=17, weeks=3)
# 2023-10-12 12:02:23.651890.
print(next_dt)

# Наступит ли уже новый год? (False).
print(next_dt > new_year_dt)    

# Узнаем, сколько времени осталось до НГ.
# 118 days, 11:57:36.348110.
print(new_year_dt - cur_dt)

# Для объектов класса time операции с интервалами не поддерживаются.
# unsupported operand type(s) for +: 'datetime.time' and 'datetime.timedelta'
# print(cur_dt.time() + tdl(hours=3))
2023-10-12 12:02:23.651890
False
118 days, 11:57:36.348110




















		
			

Пример №4. Использование модуля datetime (часть 4).

В нашем примере экземпляр класса timedelta был создан с помощью конструктора datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0), в котором все параметры необязательны для передачи, могут быть как положительными, так и отрицательными целыми или вещественными числами и по умолчанию принимают нулевые значения. При этом как есть хранятся только дни, секунды и микросекунды, а все остальные аргументы преобразуются к этим трем:

  • миллисекунда конвертируется в 1000 микросекунд,
  • минута конвертируется в 60 секунд,
  • час конвертируется в 3600 секунд,
  • неделя конвертируется в 7 дней.

Далее дни, секунды и микросекунды нормализуются таким образом, чтобы представление интервала было однозначным, а нормализованные значения попадали в следующие диапазоны:

  • 0 <= microseconds < 1000000,
  • 0 <= seconds < 3600*24 (количество секунд в одном дне),
  • -999999999 <= days <= 999999999.

Для наглядности несколько случаев создания объектов класса timedelta представлено в примере №5.

Код Результат pythonCodes
# Импортируем класс timedelta из модуля datetime.
from datetime import timedelta as tdl

# Создаем экземпляр интервала времени.
dlt_1 = tdl(
days=50,
seconds=27,
microseconds=15,
milliseconds=18000,
minutes=12,
hours=8,
weeks=3)

# Смотрим, в каком виде все хранится.
# datetime.timedelta(days=71, seconds=29565, microseconds=15).
print(repr(dlt_1))    
# Выводим привычное строковое представление.
# 71 days, 8:12:45.000015.
print(dlt_1, end='\n\n') 

# Сумма дробных остатков микросекунд в результате округляется
# до ближайшего целого. Поэтому 1014.6 округляется до 1015.  
dlt_2 = tdl(milliseconds=1.0045, microseconds=10.1) 
# datetime.timedelta(microseconds=1015).
print(repr(dlt_2))    
# 0.5 округляется вниз, поэтому получим 10.
dlt_3 = tdl(microseconds=10.5) 
# datetime.timedelta(microseconds=10).
print(repr(dlt_3), end='\n\n')       

# Нормализация отрицательных значений весьма неожиданна.
dlt_4 = tdl(milliseconds=-10) 
# datetime.timedelta(days=-1, seconds=86399, microseconds=990000). 
print(repr(dlt_4))    
# -10.5 округляется вниз до -10 (а вот -10.51 уже до -11).
dlt_5 = tdl(microseconds=-10.5) 
# datetime.timedelta(days=-1, seconds=86399, microseconds=999990).
print(repr(dlt_5))
datetime.timedelta(days=71, seconds=29565, microseconds=15)
71 days, 8:12:45.000015

datetime.timedelta(microseconds=1015)
datetime.timedelta(microseconds=10)

datetime.timedelta(days=-1, seconds=86399, microseconds=990000)
datetime.timedelta(days=-1, seconds=86399, microseconds=999990)




























		
			

Пример №5. Использование модуля datetime (часть 5).

Как видим, в результате нормализации на внутреннем хранении остаются только дни, секунды и микросекунды. При этом все остатки дробных микросекунд суммируются, а затем округляются до ближайшего целого за исключением половины микросекунды, которая округляется вниз до целого. Например, 1.23 и 1.5 микросекунды округлятся до одной микросекунды, 1.51 микросекунды округлится до двух микросекунд, -1.23 микросекунды округлится до -1 микросекунды, а -1.51 и -1.5 микросекунды округлятся до -2 микросекунд. Также следует помнить, что нормализованное значение дней не должно выходить за пределы допустимого диапазона, иначе будет вызвано исключение OverflowError.

После создания экземпляров класса timedelta над ними можно выполнять целый ряд математических операций: сложение, вычитание, умножение, деление и т.д. (см. пример №6, а также полную таблицу доступных операций с пояснениями в справочнике стандартной библиотеки Пайтона).

Код Результат pythonCodes
# Импортируем класс timedelta из модуля datetime.
from datetime import timedelta as tdl

# Создаем интервал невисокосного года.
year = tdl(days=365)
# Три невисокосных года получаем простым умножением.
three_years = 3*year    
# datetime.timedelta(days=1095).
print(repr(three_years))     

# Получаем високосный год.
one_day = tdl(days=1)
leap_year = year + one_day    
# datetime.timedelta(days=366).
print(repr(leap_year), end='\n\n')     

# Выведет везде True.
# Можно сравнивать интервалы.
print(three_years > year)     
# Обычное деление.
print(three_years/3 == year)    
# t_1//t_2 -> int (целочисленное деление).
print(three_years//(2*year) == 1)    
# t_1//int -> t_2 (как обычное деление).
print(three_years//2 == three_years/2)    
# t_1%t_2 -> t_3 (остаток от деления).
print(three_years%(2*year) == year, end='\n\n')

# Имеется у экземпляров класса и метод, который 
# выводит общее кол-во секунд: 86400.0.
print(one_day.total_seconds())
datetime.timedelta(days=1095)
datetime.timedelta(days=366)

True
True
True
True
True

86400.0



















		
			

Пример №6. Использование модуля datetime (часть 6).

Следует заметить, что стандартный модуль datetime не поддерживает автоматическое определение и конвертацию часовых поясов. Для этого нужно использовать дополнительные библиотеки, такие как pytz или dateutil (см. пример №6).

Pytz - это библиотека, которая предоставляет базу данных часовых поясов IANA, содержащую исторические и актуальные данные о смещениях и правилах перехода на летнее время для разных регионов мира. Pytz позволяет создавать объекты tzinfo, которые являются абстрактными представлениями часовых поясов, и присоединять их к объектам datetime для указания их временной зоны.

Dateutil - более мощная библиотека, которая предоставляет различные утилиты для работы с датой и временем. Dateutil также поддерживает базу данных часовых поясов IANA и позволяет создавать объекты tzinfo с помощью функции gettz.

Код Результат pythonCodes
# Импортируем необходимые модули.
import datetime
import pytz
import dateutil.tz

# Создаем объект datetime без указания часового пояса.
dt = datetime.datetime(2022, 12, 31, 23, 59, 59)
# 2022-12-31 23:59:59.
print(dt) 

# Создаем объект tzinfo для часового пояса Минска.
minsk_tz = dateutil.tz.gettz("Europe/Minsk")
# Создаем объект tzinfo для часового пояса Нью-Йорка.
new_york_tz = dateutil.tz.gettz("America/New_York")

# Задаем объекту datetime часовой пояс Минска.
dt_minsk_tz = dt.astimezone(minsk_tz)
# 2020-12-31 23:59:59+03:00.
print(dt_minsk_tz)     

# Конвертируем объект datetime из одного часового пояса в другой.
dt_new_york = dt.astimezone(new_york_tz)
# 2020-12-31 15:59:59-05:00 (время перевелось автоматически).
print(dt_new_york, end='\n\n') 

# Тоже самое с помощью pytz.

# Создаем объект datetime без указания часового пояса.
dt = datetime.datetime(2022, 12, 31, 23, 59, 59)
# 2022-12-31 23:59:59.
print(dt) 
    
# Создаем объект tzinfo для часового пояса Минска.
minsk_tz = pytz.timezone("Europe/Minsk")
# Вначале обязательно переходим на UTC (доп. действие).
dt.replace(tzinfo=pytz.utc)
# Задаем объекту datetime часовой пояс Минска.
dt_minsk = dt.astimezone(minsk_tz)
# 2020-12-31 23:59:59+03:00.
print(dt_minsk) 

# Создаем объект tzinfo для часового пояса Нью-Йорка.
new_york_tz = pytz.timezone("America/New_York")
# Конвертируем объект datetime из одного часового пояса в другой.
dt_new_york = dt_minsk.astimezone(new_york_tz)
# 2020-12-31 15:59:59-05:00 (время перевелось автоматически).
print(dt_new_york, end='\n\n') 

# Выводим список актуальных названий зон базы IANA.
print(pytz.common_timezones)
2022-12-31 23:59:59
2022-12-31 23:59:59+03:00
2022-12-31 15:59:59-05:00

2022-12-31 23:59:59
2022-12-31 23:59:59+03:00
2022-12-31 15:59:59-05:00

['Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 
'Africa/Algiers', 'Africa/Asmara', 'Africa/Bamako', 
'Africa/Bangui', 'Africa/Banjul', 'Africa/Bissau', 

...

'Europe/Berlin', 'Europe/Bratislava', 'Europe/Brussels', 
'Europe/Bucharest', 'Europe/Budapest', 'Europe/Busingen', 
'Europe/Chisinau', 'Europe/Copenhagen', 'Europe/Dublin', 
'Europe/Gibraltar', 'Europe/Guernsey', 'Europe/Helsinki', 
'Europe/Isle_of_Man', 'Europe/Istanbul', 'Europe/Jersey', 
'Europe/Kaliningrad', 'Europe/Kirov', 'Europe/Kyiv', 
'Europe/Lisbon', 'Europe/Ljubljana', 'Europe/London', 
'Europe/Luxembourg', 'Europe/Madrid', 'Europe/Malta', 
'Europe/Mariehamn', 'Europe/Minsk', 'Europe/Monaco', 
'Europe/Moscow', 'Europe/Oslo', 'Europe/Paris', 

...

'Pacific/Wake', 'Pacific/Wallis', 'US/Alaska', 
'US/Arizona', 'US/Central', 'US/Eastern', 'US/Hawaii', 
'US/Mountain', 'US/Pacific', 'UTC']


















		
			

Пример №7. Использование библиотек pytz и dateutile.

Поскольку библиотеки pytz и dateutil в состав стандартной библиотеки Питона не входят, их нужно сперва в окружение установить, использовав для этого команды «pip install pytz» и «pip install python-dateutil».

Быстрый переход к другим страницам