Рубріки: Теория

Модуль datetime в Python: как работать с датой и временем

Сергій Бондаренко

Информация о дате в Python — это не отдельный тип данных. Поэтому для выполнения операций с датой и временем используется модуль datetime. Вначале нужно его импортировать — это даст возможность работать с датами как с объектами отдельного типа.

Как вывести подробную текущую дату

import datetime                                #Импорт модуля
vremya = datetime.datetime.now()  #Вызов метода now из класса datetime
print(vremya)                                    #Вывод времени на экран

Этот код отображает сведения о текущем времени и выводит на экран подробную дату вплоть до микросекунд:

2021-09-27 10:59:29.217179

Создание конкретной даты

Для создания конкретной даты используется класс datetime() одноименного модуля. Класс datetime() определяется тремя аргументами для создания даты: год, месяц, день. Давайте посмотрим, как это выглядит в коде:

import datetime                                     #Импорт модуля
x = datetime.datetime(2020, 5, 17)                  #Задание даты
print(x)                                            #Вывод даты на экран

Освоить язык программирования Python вам могут помочь онлайн курсы от наших партнеров Mate Academy и Powercode. Получите качественный уровень знаний от практикующих специалистов.

Функция strftime()

Функцию strftime() используют для преобразования объектов даты и времени в их строковое представление. Этот значительно упрощает настройку формата времени и даты при выводе на экран.

Как вывести на экран год и день недели с помощью strftime()

import datetime                        #Импорт модуля
x = datetime.datetime.now()    #Вызов метода now из класса datetime
print(x.year)                              #Вывод на экран значения текущего года
print(x.strftime("%A"))              #Отображение на экране значения текущего дня недели
Параметр метода strftime() Описание Пример
%a День недели сокращенно Wed
%A День недели Wednesday
%w Номер дня недели, начиная с Sunday — 0, Monday — 1… 3
%d День месяца 15
%b Название месяца

сокращенно

Sep
%B Название месяца September
%m Номер месяца 01-12 09
%y Год, сокращенный вариант 21
%Y Год, полностью 2021
%H Час 0-23 16
%I Час 0-12 04
%p AM/PM PM
%M Минуты 20
%S Секунды 25
%f Микросекунды 000000-999999 975971
%z Отклонение от всемирного координированного времени (UTC) +0100
%j Номер дня в году 001-366 258
%U Номер недели в году, начинающаяся с воскресения 00-53 37
%W Номер недели в году, начинающаяся с понедельника

00-53

37
Локальное время Thu Sep 16 04:20:25 2021
Век 21
%x Локальная дата 09/16/21
%X Локальное время 04:20:425
%G ISO 8601 год 2021
%u ISO 8601 рабочий день (1-7) 3
%V ISO 8601 номер недели (01-53) 37

Актуальная дата

В случае, когда нужно получить и настроить значение актуальной даты, задействуется класс date:

>>> from datetime import date
>>> cur = date.today()
>>> print(cur)

В консоли отобразится следующий формат даты:

2021-09-16

Актуальное время

Для получения текущего времени нужно вернуть данные про актуальную дату и время, после чего извлечь информацию про время с помощью метода time:

>>> import datetime
>>> current_date_time = datetime.datetime.now()
>>> current_time = current_date_time.time()
>>> print(current_time)

С помощью атрибутов модуля datetime можно получать разные версии отображения времени. Применим функцию dir() и укажем нужный атрибут:

>>> import datetime
>>> attr = dir(datetime)
>>> print(attr)
['MAXYEAR', 'MINYEAR', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'date', 'datetime', 'datetime_CAPI', 'sys', 'time', 'timedelta', 'timezone', 'tzinfo']

Если есть необходимость работать со временем как с объектом, применим класс time модуля datetime. Структура класса описывается следующим образом: datetime.time(hour, minutes, seconds).

Например:

import datetime                                          #Импорт модуля datetime 

timeobj = datetime.time(11,28,45)             #Генерируется объект time с параметрами 11 часов 28 минут 45 секунд   

print(timeobj)                                             # Вывод времени на экран

Создать новую дату

Чтобы создать новую дату, воспользуемся синтаксисом datetime.datetime(year,month,day):

import datetime                                               # Импорт модуля datetime 
date_obj = datetime.datetime(2021,11,27)     # Создается экземпляр класса даты
print(date_obj)                                                # Вывод даты на экран

Определить временной промежуток

Для определения временного промежутка используется атрибут timedelta(). Объект timedelta выглядит вот так:

td_object =timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
td_object
datetime.timedelta(0)

Расстояние между датами

Используемые нами аргументы опциональны, по умолчанию они приравниваются нулю. Это целые числа или числа с плавающей запятой. Они могут быть с плюсом или минусом, благодаря чему можно вычислять временной промежуток между двумя значениями:

>>> from datetime import date
>>> f = date(2021,11,13)
>>> s = date(2020,10,11)
>>> delta = f - s
>>> print(delta)

Консоль выведет:

398 days, 0:00:00

Обращаясь к timedelta, можно выполнять разные математические операции. Например, вы можете добавлять дни, минуты, секунды, часы, недели к объекту datetime.date или datetime.datetime:

>>> import datetime
>>> now = datetime.datetime.now()
>>> now
datetime.datetime(2021, 9, 27, 13, 39, 25, 771446)
>>> from datetime import timedelta
>>> now + timedelta(days=3)
datetime.datetime(2021, 9, 30, 13, 39, 25, 771446)
>>> now +timedelta(days=-3)
datetime.datetime(2021, 9, 24, 13, 39, 25, 771446)

Поскольку аргументы timedelta по умолчанию установлены в ноль, у нас есть возможность использовать их выборочно, что позволяет добавлять, скажем, только минуты:

>>> import datetime
>>> now=datetime.datetime.now()
>>> now
datetime.datetime(2021, 9, 27, 13, 59, 22, 649538)
>>> from datetime import timedelta
>>> now+timedelta(minutes=3)
datetime.datetime(2021, 9, 27, 14, 2, 22, 649538)
>>> now+timedelta(minutes=-3)
datetime.datetime(2021, 9, 27, 13, 56, 22, 649538)

Сравнение дат

Также можно сравнить даты. Например: 

>>>import datetime
>>>now = datetime.time(7, 30, 0)
>>>next_hour = datetime.time(10, 30, 0)
>>>print('now < next_hour:', now < next_hour)
>>>today = datetime.date.today()
>>>next_week = datetime.date.today() + datetime.timedelta(days=7)
>>>print('today > next_week:', today > next_week)

Консоль выдаст:

now < next_hour: True
today > next_week: False

Операции с часовыми поясами

В Python cуществует два типа данных, содержащих информацию о времени: абсолютные (naive) и относительные (aware).

Они отличаются тем, что в случае с абсолютными датами (naive) информация о временном поясе не учитывается. В случае же с относительными (aware) информация про временной пояс передается и также учитывается летнее время. Соответственно, абсолютные данные удобнее для работы.

Отличия между основными стандартами времени

  • GMT (Greenwich Mean Time — среднее время по Гринвичу или гринвичское время) — это официальный часовой пояс, используемый в некоторых странах Европы и Африки. Например, местное время для Берлина 2020–10–17 09:40:33.614581+02:00 GMT. Время в Санкт-Петербурге на 3 часа опережает время в GMT.
  • DST (day saving time) — летнее время. Летнее время устанавливается на летний период на час вперед относительно текущего стандартного времени. Осенью часы переводят на час назад на так называемое зимнее время. Перевод стрелок выполняется в ночь с субботы на воскресенье. Перевод времени делается с целью экономии ресурсов и из соображений рационального расходования электроэнергии
  • UTC — всемирное координированное время. Информация про время в стандарте UTC актуально для всех часовых поясов на планете. Поскольку UTC служит отправной точкой времени при написании кода на Python, мы советуем всегда работать в этом стандарте. Это позволит избежать ошибок из-за разницы в показаниях времени для разных мест.

Как создать простой aware-объект datetime, учитывающий часовой пояс

import datetime
dt_now = datetime.datetime.utcnow()
print(dt_now)

Один из недостатков библиотеки datetime Python — отсутствие поддержки часовых поясов. В случае, когда нужно учитывать часовой пояс, используется другая библиотека – pytz. В первой строке кода эту библиотеку также нужно импортировать. Предположим, что нам необходимо задать время в столице Кении — Найроби:

import pytz
import datetime
tz_nairobi = pytz.timezone("Africa/Nairobi")
dt_nairobi =datetime.datetime.now(tz_nairobi)
print(dt_nairobi)

Консоль выведет:

2021-09-16 10:36:40.856322+03:00

А вот так высчитывается время в Праге:

import pytz
import datetime
tz_praha = pytz.timezone("Europe/Prague")
dt_praha = datetime.datetime.now(tz_praha)
print(dt_praha)

Результат:

2021-09-16 09:41:02.260775+02:00

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023