Что такое datetime
Перейти к содержимому

Что такое datetime

  • автор:

Модуль datetime

Python 3 логотип

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

Классы, предоставляемые модулем datetime:

Класс datetime.date(year, month, day) — стандартная дата. Атрибуты: year, month, day. Неизменяемый объект.

Класс datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None) — стандартное время, не зависит от даты. Атрибуты: hour, minute, second, microsecond, tzinfo.

Класс datetime.timedelta — разница между двумя моментами времени, с точностью до микросекунд.

Класс datetime.tzinfo — абстрактный базовый класс для информации о временной зоне (например, для учета часового пояса и / или летнего времени).

Класс datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None) — комбинация даты и времени.

  • datetime.MINYEAR (1) ≤ year ≤ datetime.MAXYEAR (9999)
  • 1 ≤ month ≤ 12
  • 1 ≤ day ≤ количество дней в данном месяце и году

Методы класса datetime:

datetime.today() — объект datetime из текущей даты и времени. Работает также, как и datetime.now() со значением tz=None.

datetime.fromtimestamp(timestamp) — дата из стандартного представления времени.

datetime.fromordinal(ordinal) — дата из числа, представляющего собой количество дней, прошедших с 01.01.1970.

datetime.now(tz=None) — объект datetime из текущей даты и времени.

datetime.combine(date, time) — объект datetime из комбинации объектов date и time.

datetime.strptime(date_string, format) — преобразует строку в datetime (так же, как и функция strptime из модуля time).

datetime.strftime(format) — см. функцию strftime из модуля time.

datetime.date() — объект даты (с отсечением времени).

datetime.time() — объект времени (с отсечением даты).

datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]]) — возвращает новый объект datetime с изменёнными атрибутами.

datetime.timetuple() — возвращает struct_time из datetime.

datetime.toordinal() — количество дней, прошедших с 01.01.1970.

datetime.timestamp() — возвращает время в секундах с начала эпохи.

datetime.weekday() — день недели в виде числа, понедельник — 0, воскресенье — 6.

datetime.isoweekday() — день недели в виде числа, понедельник — 1, воскресенье — 7.

datetime.isocalendar() — кортеж (год в формате ISO, ISO номер недели, ISO день недели).

datetime.isoformat(sep=’T’) — красивая строка вида «YYYY-MM-DDTHH:MM:SS.mmmmmm» или, если microsecond == 0, «YYYY-MM-DDTHH:MM:SS»

datetime.ctime() — см. ctime() из модуля time.

Пример работы с классом datetime:

Для вставки кода на Python в комментарий заключайте его в теги

  • Модуль csv - чтение и запись CSV файлов
  • Создаём сайт на Django, используя хорошие практики. Часть 1: создаём проект
  • Онлайн-обучение Python: сравнение популярных программ
  • Книги о Python
  • GUI (графический интерфейс пользователя)
  • Курсы Python
  • Модули
  • Новости мира Python
  • NumPy
  • Обработка данных
  • Основы программирования
  • Примеры программ
  • Типы данных в Python
  • Видео
  • Python для Web
  • Работа для Python-программистов
  • Сделай свой вклад в развитие сайта!
  • Самоучитель Python
  • Карта сайта
  • Отзывы на книги по Python
  • Реклама на сайте

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

Форматирование, преобразования и обработка даты и времени

Модуль datetime предоставляет классы для манипулирования датами и временем.

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

Объекты даты и времени могут быть классифицированы как "осведомленные" или "наивные".

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

"Наивный" объект не содержит достаточно информации о времени в конкретном месте. Представляет ли "наивный" объект Всемирное координированное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит только от программы, так же как от программы зависит, представляет ли конкретное число - метры или мили. "Наивные" объекты легко понять и работать с ними за счет игнорирования некоторых аспектов реальности.

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

Модуль datetime предоставляет только один конкретный класс tzinfo - класс часовых поясов. Класс часовых поясов может представлять простые часовые пояса с фиксированными смещениями от UTC, например сам UTC или североамериканские часовые пояса EST и EDT. Поддержка часовых поясов на более глубоких уровнях детализации зависит от приложения.

Модуль datetime определяет следующие типы:

  • Класс datetime.date представляет собой идеализированную "наивную" дату, при условии, что текущий григорианский календарь всегда был и всегда будет в силе.Имеет атрибуты: year , month , day .
  • Класс datetime.time представляет собой идеализированное время, независимое от любого конкретного дня, при условии, что каждый день имеет ровно 24 * 60 * 60 секунд.Имеет атрибуты: hour , minute , second , microsecond и tzinfo .
  • Класс datetime.datetime представляет собой сочетание объектов datetime.date и datetime.time .Имеет атрибуты: year , month , day , hour , minute , second , microsecond и tzinfo .
  • Класс datetime.timedelta представляет собой длительность, выражающая разницу между двумя экземплярами даты, времени или даты и времени с микросекундным разрешением.
  • Класс datetime.tzinfo представляет собой абстрактный базовый класс для информационных объектов часового пояса.Он используются классами datetime и time для предоставления настраиваемого понятия корректировки времени, например для учета часового пояса и/или перехода на летнее время.
  • Класс datetime.timezone реализует абстрактный базовый класс tzinfo как фиксированное смещение от UTC.

Общие свойства.

Типы datetime.date , datetime.time , datetime.datetime и datetime.timezone имеют следующие общие характеристики:

  • Объекты этих типов неизменны.
  • Объекты этих типов являются хешируемыми, что означает, что они могут использоваться в качестве ключей словаря.
  • Объекты этих типов поддерживают сериализацию с помощью модуля pickle .
  • КРАТКИЙ ОБЗОР МАТЕРИАЛА.
  • Класс timedelta() модуля datetime
  • Примеры использования datetime.timedelta()
  • Класс date() модуля datetime
  • Методы экземпляра datetime.date()
  • Примеры использования datetime.date()
  • Класс datetime() модуля datetime
  • Методы экземпляра datetime.datetime()
  • Примеры работы с модулем datetime
  • Класс time() модуля datetime
  • Класс tzinfo() модуля datetime
  • Класс timezone() модуля datetime
  • Правила форматирования strftime() и strptime() модуля datetime

Класс datetime. Работа с датой и временем в Python

Класс datetime , входящий в одноименный ему модуль datetime стандартной библиотеки Python, по большей части реализует совокупность тех возможностей, которые есть по отдельности в ранее рассмотренных нами классах date и time .

В случае необходимости экземпляр datetime разбирается на дату и время. Также можно выполнить обратное – собрать экземпляры date и time в один. В первом случае вызываются методы date() и time() экземпляра datetime . Во втором случае – метод combine(…) класса.

from datetime import datetime, date, time, timezone, timedelta a = datetime(2023, 5, 19, 21, 49, tzinfo=timezone(timedelta(hours=3))) print(a) # 2023-05-19 21:49:00+03:00 print(a.date()) # 2023-05-19 print(a.time()) # 21:49:00 print(a.timetz()) # 21:49:00+03:00 d = date(2023, 5, 20) t = time(10, 50, 34) dt = datetime.combine(d, t) # если бы в t был timezone, здесь он был бы также dt_tz = datetime.combine(d, t, timezone(timedelta(hours=2))) print(dt) # 2023-05-20 10:50:34 print(dt_tz) # 2023-05-20 10:50:34+02:00

Чтобы получить текущее время, используются классовые методы today и now . Первый возвращает местное время как наивное. Второй позволяет указать часовой пояс.

from datetime import datetime, timezone, timedelta a = datetime.today() print(a.strftime("%d %b %Y, %A, %H:%M")) print(a.strftime("%d %b %Y, %A, %I:%M %p")) b = datetime.now(timezone(timedelta(hours=3))) print(b.strftime("%d %b %Y, %A, %H:%M %Z")) c = datetime.now(timezone.utc) print(c.strftime("%d %b %Y, %A, %H:%M %Z"))
19 May 2023, Friday, 23:12 19 May 2023, Friday, 11:12 PM 19 May 2023, Friday, 23:12 UTC+03:00 19 May 2023, Friday, 20:12 UTC

В примере при создании третьего экземпляра datetime используется константа timezone.utc , которая содержит экземпляр timezone с нулевой таймдельтой.

Если вы хотите локальное время перевести в UTC или время какого-то другого часового пояса (выполнить корректировку часового пояса – time zone adjustments), то сделать это можно с помощью метода astimezone .

from datetime import datetime, timezone, timedelta moscow = timezone(timedelta(hours=3), "Moscow") new_york = timezone(timedelta(hours=-4), "New York") a = datetime.now(moscow) b = a.astimezone(new_york) print(a.strftime("%H:%M:%S %Z")) print(b.strftime("%H:%M:%S %Z")) c = b.astimezone(timezone.utc) print(c.strftime("\n%H:%M:%S %Z"))
16:40:29 Moscow 09:40:29 New York 13:40:29 UTC

Если в astimezone не передать часовой пояс, тогда из времени экземпляра, к которому применяется метод, вы получите ваше локальное время. Оно определяется из данных операционной системы.

from datetime import datetime, timedelta, timezone a = datetime(2023, 5, 26, 20, 30) b = datetime.now(timezone(timedelta(hours=-4))) print(b, end='\n\n') a2 = a.astimezone() b2 = b.astimezone() print(a2, a2.tzname()) print(b2, b2.tzname())
2023-05-21 10:01:17.873329-04:00 2023-05-26 20:30:00+03:00 MSK 2023-05-21 17:01:17.873329+03:00 MSK

В коде выше, применив astimezone без аргументов к наивному времени, мы получили это же самое время, но уже осведомленное. В данном случае – с указанием местного часового пояса.

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

from datetime import datetime, timedelta, timezone a = datetime(2023, 5, 26, 20, 30, tzinfo=timezone(timedelta(hours=3))) b = a.replace(tzinfo=timezone(timedelta(hours=-4))) c = a.replace(tzinfo=None) # наивное время print(a.timetz()) # 20:30:00+03:00 print(b.timetz()) # 20:30:00-04:00 print(c.timetz()) # 20:30:00

Подобно date экземпляры datetime поддерживают следующие операции:

  • Сравнение объектов между собой. Результат – True или False .
  • Вычитание из одного объекта другого. Результат – экземпляр timedelta .
  • Вычитание и прибавление таймдельты. Результат – экземпляр datetime .

Однако, в связи с появлением свойства tzinfo , для сравнений действуют те же правила, что и для time .

Кроме того, вычисление разницы между двумя datetime возможно, когда обе даты с временем являются либо наивными, либо обе – осведомленными. Во втором случае при различных часовых поясах за кулисами выполняется приведение времени к UTC.

from datetime import datetime a = datetime.fromisoformat("2023-05-21 19:05:23 +03:00") b = datetime.fromisoformat("2023-05-22 00:05:23 +01:00") ba = b - a print(ba) # 7:00:00 print(ba.__repr__()) # datetime.timedelta(seconds=25200)

В примере первое время соответствует 16-ти часам в зоне UTC, второе 23-м. Разница между моментами времени составляет 7 часов.

Обратите внимание, здесь не важно, какая будет таймзона у результата, потому что у таймдельты (отрезка времени) нет такого параметра.

В то же время при сложении/вычитании datetime с timedelta у первого сохраняется его часовой пояс.

from datetime import datetime, timedelta a = datetime.fromisoformat("2023-05-21 19:05:23 +03:00") delta = timedelta(days=1, hours=5, minutes=30) print(a + delta) # 2023-05-23 00:35:23+03:00 print(a - delta) # 2023-05-20 13:35:23+03:00

Атрибуты класса datetime (подчеркнуты не упомянутые в уроке):

  • данные, хранимые в классе (свойства класса): min , max , resolution
  • методы класса: strptime , today , now , utcnow , combine , fromisoformat , fromisocalendar , fromtimestamp , utcfromtimestamp , fromordinal
  • свойства экземпляра: year , month , day , hour , minute , second , microsecond , tzinfo , fold
  • методы экземпляра: date , time , timetz , replace , astimezone , isoformat , strftime , utcoffset , dst , tzname , timetuple , utctimetuple , toordinal , timestamp , weekday , isoweekday , isocalendar , ctime

X Скрыть Наверх

Даты и время в Python. Курс

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

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

Ефективний курс від mate.academy: Frontend.
Розблокуйте світ веб-розробки.

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

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

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

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

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

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

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

Функция strftime()

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

Інтенсивний курс від laba: Product management.
Від ідеї до успішного продукту.

Как вывести на экран год и день недели с помощью 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 Название месяца

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

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

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

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

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

Для получения текущего времени нужно вернуть данные про актуальную дату и время, после чего извлечь информацию про время с помощью метода 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 выглядит вот так:

Ефективний курс від laba: Фінансовий менеджер.
Оптимізуйте фінансовий розвиток компанії.

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)

Обращаясь к 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.

Вдохновляючий курс від skvot: Створення текстів.
Мистецтво слова та стилю.

Как создать простой 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)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *