Datetime Python

Основы

Введение

Работа программиста со временем и датой зачастую связана со многими сложностями. Дело в том, что существует множество форматов представления таких данных. Они зависят от локализации (местоположения), предпочтения тех, кто генерирует эти данные и много-много ещё от чего. В итоге, выполняя простейшие для повседневной жизни операции, программист может столкнуться с целым набором сложностей. К счастью, в языке Python есть встроенный модуль под названием datetime. Этот модуль призван максимально упростить данный класс задач. Давайте знакомиться!

Применение

Модуль datetime применяется в Пайтоне для операций с датами и временем и стремится сделать это оптимальным способом.
Этот модуль включает в себя различные классы, методы которых позволяют:
Узнать сколько сейчас времени и какая дата.
Выполнить манипуляции с датами, такие, например, как вычисление промежутка времени.
Выполнить манипуляции со временем, такие, например, как сравнение двух моментов времени.
Менять формат представления времени и даты.
Номер года, который допускает модуль, лежат внутри интервала от 1 до 9999
Для начала использования данного модуля Вам необходимо импортировать его в Ваш код:

Отличие datetime от time

В стандартной библиотеке Питона есть ещё один модуль: time. Он тоже предназначен для работы со временем. В чём их отличие? Разница в том, что модуль time главным образом предназначен для работы с метками времени Unix (выражается в виде числа с плавающей запятой, считающегося секундами с эпохи Unix). datetime модуль может поддерживать многие из тех же операций, но обеспечивает более объектно-ориентированный набор типов, а также имеет некоторую ограниченную поддержку часовых поясов.

Классы библиотеки

Как мы уже упоминали, библиотека datetime состоит из нескольких классов, которые перечислены в следующей таблице:
Метод Описание
date позволяет манипулировать датами независимо от времени (месяц, день, год)
time позволяет управлять временем независимо от даты (час, минута, секунда, микросекунда)
datetime позволяет нам управлять временем и датами вместе (месяц, день, год, час, секунда, микросекунда)
timedelta продолжительность времени, используемого для управления датами и измерения
tzinfo абстрактный класс для работы с часовыми поясами
timezone абстрактный базовый класс как фиксированное смещение от UTC

date

Класс date применяется для отображения даты, состоящей из года, месяца и числа.
Объект, порождаемый этим классом, является датой (год, месяц и день) по Григорианскому календарю.
1 января года 1 будет иметь №1, 2 января года 1 — №2 и так далее.
Каждый параметр должен быть целым числом в определённых диапазонах:
1 <= год <= 9999
1 <= месяц <= 12
1 <= день <= количество дней в данном месяце и году
Если указан аргумент за пределами этих диапазонов, интерпретатор вернёт ошибку ValueError.

import datetime

today_date = datetime.date(2021, 7, 22)
print(today_date)
print(type(today_date))
print('Или так:')
norbert_birthday = datetime.date(year=1894, month=11, day=26)
print(norbert_birthday)
# Вывод:
2021-07-22
<class 'datetime.date'>
Или так:
1894-11-26


Для возврата сегодняшней локальной даты используется функция класса date today (). Функция today () имеет несколько атрибутов (год, месяц и день).

import datetime

today_date = datetime.date.today()
print(today_date)
# Вывод:
2021-07-22


Атрибуты даты можно вывести по отдельности:

import datetime

today_date = datetime.date.today()
print('Год:', today_date.year, end=' ')
print('Месяц:', today_date.month, end=' ')
print('День:', today_date.day, end='')
# Вывод:
Год: 2021 Месяц: 7 День: 22


Однако, стоит помнить, что у уже созданного объекта изменить атрибуты не получится:

import datetime

today_date = datetime.date(2021, 7, 22)
today_date.year += 1
print(today_date)
# Вывод:
Traceback (most recent call last):
File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.1\scratches\scratch.py", line 4, in
today_date.year += 1
AttributeError: attribute 'year' of 'datetime.date' objects is not writable

Process finished with exit code 1

time

Класс time предназначен для отображения времени без использования даты. Создаётся объект этого класса так же, как и date, но со своими параметрами. Все аргументы необязательны. Аргумент tzinfo может иметь тип None или быть экземпляром класса tzinfo. Остальные аргументы должны быть целыми числами в следующих диапазонах:
• 0 <= час < 24,
• 0 <= минута < 60,
• 0 <= секунда < 60,
• 0 <= микросекунда < 1000000,
Когда передаётся значение параметра, лежащее вне этих диапазонов, интерпретатор возвращает ошибку ValueError. Все аргументы имеют значение по умолчанию 0, кроме tzinfo, которое по умолчанию None. Вот пример, использующий данный класс:

from datetime import time

a = time()
print("a =", a)

b = time(00, 1, 1)
print("b =", b)

c = time(hour = 00, minute = 1, second = 1)
print("c =", c)

d = time(12, 16, 13, 566234)
print("d =", d)
# Вывод:
a = 00:00:00
b = 00:01:01
c = 00:01:01
d = 12:16:13.566234


Аналогично классу date, после создания time объекта вы можете легко распечатать его атрибуты, такие как час, минута и т.п.

from datetime import time

a = time(12, 16, 17)
print("Часы:", a.hour)
print("Минуты:", a.minute)
print("Секунды:", a.second)
print("Микросекунды:", a.microsecond)
# Вывод:
Часы: 12
Минуты: 16
Секунды: 17
Микросекунды: 0


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

datetime

В datetime модуле есть класс с именем datetime, который может содержать информацию как из объектов даты, так и из объектов времени.

from datetime import datetime

today_date = datetime(2021, 7, 22)
print(today_date)

random_date = datetime(1999, 11, 28, 23, 55, 59, 342380)
print(random_date)
# Вывод:
2021-07-22 00:00:00
1999-11-28 23:55:59.342380


Первые три аргумента (год, месяц и день) в datetime() конструкторе обязательны:

from datetime import datetime

today_month = datetime(2021, 7)
print(today_month)
# Вывод:
Traceback (most recent call last):
File "C:\Users\ivand\AppData\Roaming\JetBrains\PyCharm2021.1\scratches\scratch.py", line 3, in
today_month = datetime(2021, 7)
TypeError: function missing required argument 'day' (pos 3)

Process finished with exit code 1


Получить настоящий момент времени можно используя методы, один из которых уже использовался ранее в date. Следующий код иллюстрирует вызов методов today и now, возвращающих в Питон текущую дату и время:

import datetime

today_date = datetime.datetime.today()
time_now = datetime.datetime.now()
print('Сегодня:', today_date)
print('Сейчас:', time_now)
# Вывод:
Сегодня: 2021-07-22 16:26:25.224837
Сейчас: 2021-07-22 16:26:25.224836


Если Вам не подходит тот формат, в котором данные отображаются по умолчанию, Вы можете воспользоваться методом strftime().
Метод strftime() создает отформатированную строку из заданного объекта date, datetime или time. Он принимает различные идентификаторы формата как параметры и меняет на их основании строковое представление.
Форматирование даты с помощью strftime():

from datetime import datetime

now = datetime.now()

t = now.strftime("%H:%M:%S")
print("Первая строка:", t)

s1 = now.strftime("%m/%d/%Y, %H:%M:%S, %A %B %Y")
print("Вторая строка:", s1)

s2 = now.strftime("%a %b %y, %d/%m/%Y, %H:%M:%S")
print("Третья строка:", s2)
# Вывод:
Первая строка: 08:27:45
Вторая строка: 07/23/2021, 08:27:45, Friday July 2021
Третья строка: Fri Jul 21, 23/07/2021, 08:27:45


Здесь %Y, %m, %d, и т.д. являются кодами формата strftime() Метод принимает один или несколько кодов формата. В таблице ниже показаны коды, которые можно передавать в strftime():

Код Описание Пример
%aСокращенное название дня недели.Fri
%AПолное название дня недели.Friday
%wДень недели в виде десятичного числа.0, 1, …, 6
%dДень месяца.23
%bСокращенное название месяца.Jul
%BПолное название месяца.July
%mМесяц как десятичное число с нулями.01, 02, …, 12
%yГод без века как десятичное число с нулями.21
%YГод с веком в виде десятичного числа.2021
%HЧас (в 24-часовом формате) как десятичное число с нулями.00, 01, …, 23
%IЧас (12-часовой формат) в виде десятичного числа с нулями.01, 02, …, 12
%pЛокаль AM или PM.AM
%MМинута в виде десятичного числа с нулями.00, 01, …, 59
%SСекунды как десятичное число с нулями.00, 01, …, 59
%fМикросекунды в виде десятичного числа с нулями слева.000000–999999
%zСмещение UTC.+0000, -0400, +1030
%ZНазвание часового пояса.UTC, GMT
%jДень года в виде десятичного числа с нулями.001, 002, …, 366
%UНомер недели в году (воскресенье как первый день недели). Все дни нового года, предшествующие первому воскресенью, считаются нулевой неделей.00, 01, …, 53
%WНомер недели в году (понедельник как первый день недели). Все дни нового года, предшествующие первому понедельнику, считаются нулевой неделей.00, 01, …, 53
%cСоответствующее представление даты и времени местного стандарта.Fri Jul 23 08:37:50 2021
%xСоответствующее представление даты местного стандарта.07/23/21
%XСоответствующее представление времени местного стандарта.08:42:41
%%Буквальный символ «%».%

Как и в случае с time и date, в классе datetime можно обратиться к конкретной составляющей объекта:

import datetime

now = datetime.datetime.now()
print('Сейчас')
print('Год:', now.year)
print('Месяц:', now.month)
print('День:', now.day)
print('Часов:', now.hour)
print('Минут:', now.minute)
print('Секунд', now.second)
print('Микросекунд:', now.microsecond)
# Вывод:
Сейчас
Год: 2021
Месяц: 7
День: 23
Часов: 8
Минут: 48
Секунд 23
Микросекунд: 695403


Сформировать новый объект типа datetime можно и с помощью двух разных объектов, представляющих время и дату (time и date). Для этого используется функция combine. В следующем примере показывается как переменные a и b получают некоторые значения, после чего передаются методу combine в качестве двух параметров.

from datetime import datetime, date, time

today_date = date(2021, 7, 23)
time_now = time(8, 48, 23)
today_datetime = datetime.combine(today_date, time_now)
print(today_datetime)
# Вывод:
2021-07-23 08:48:23


Другие функции класса datetime:
Метод Описание
utcnow () текущая дата и время в формате UTC
fromtimestamp() местная дата и время, соответствующие метке времени POSIX
utcfromtimestamp() дата и время в формате UTC, соответствующее метке времени POSIX
fromordinal() дата и время, соответствующее Григорианскому порядковому номеру, где 1 января 1 года имеет порядковый номер 1
combine() возвращает новый объект datetime, компоненты даты которого равны заданному объекту даты и времени
fromisoformat() возвращает datetime.time(), который соответствует строке time_string в одном из форматов, возвращаемых методом time.isoformat()

Операции

Пользуясь классом datetime, можно легко находить разницу между двумя разными датами. Следующим пример демонстрирует создание двух объектов:

from datetime import datetime

today_date = datetime.now()
random_date = datetime(1989, 9, 21)
delta = today_date - random_date
print(delta.days)
print(delta.seconds)
print(delta.microseconds)
# Вывод:
11628
32213
845546


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

Операция Значение
a + bсуммирует значения дат a и b
a – bнаходит разницу между датами a и b
a * iумножает численное представление свойств даты a на некую константу i
a // iделит численное представление свойств даты a на некую константу i, остаток отбрасывается
+aвозвращает объект timedelta с полностью идентичным значением a
–aвозвращает объект timedelta с полностью противоположным значением a
a > bвозвращает true, если a больше b
a < bвозвращает true, если a меньше b
abs(a)возвращает объект timedelta с положительным значением всех свойств a
str(a)возвращает строковое представление объекта a в формате, заданном по умолчанию
repr(a)возвращает строковое представление объекта a в формате с отрицательными значениями

timedelta

Метод timedelta предназначен для вычисления различий в датах. Это один из самых простых способов манипулировать датой.
Мы можем создать объект timedelta, используя конструктор его класса.

from datetime import timedelta

timedelta_object = timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
print(timedelta_object)
zero_obj = timedelta()
print(zero_obj)
# Вывод:
0:00:00
0:00:00


Обратите внимание, что мы можем настроить параметры для создания нашего собственного объекта datetime. Если вы не устанавливаете значение аргумента, по умолчанию принимается 0. Аргументы могут быть целыми или плавающими, а также положительными или отрицательными.
Помимо создания наших собственных объектов timedelta, мы также можем манипулировать существующими объектами timedelta.
Мы можем складывать, вычитать или делить два объекта timedelta с помощью основных операторов.

from datetime import timedelta

timedelta_object = timedelta(hours=10, seconds=10)
print('timedelta_object:', timedelta_object)
new_timedelta_object = timedelta(hours=5, seconds=25)
print('new_timedelta_object:', new_timedelta_object)
print('Операции:')
print('Сложение:', timedelta_object + new_timedelta_object, 'Вычитание:', timedelta_object - new_timedelta_object, 'Деление:', timedelta_object / new_timedelta_object, sep='\n')
# Вывод:
timedelta_object: 10:00:10
new_timedelta_object: 5:00:25
Операции:
Сложение:
15:00:35
Вычитание:
4:59:45
Деление:
1.9977808599167823

tzinfo и timezone

Классы tzinfo и timezone применяются для работы с информацией, которая содержит сведения о часовых поясах. Создать объект, принадлежащий типу tzinfo невозможно, поскольку этот класс является абстрактным. Однако можно воспользоваться наследованием, создав собственный класс на основе tzinfo. При этом следует помнить, что для работы с такими объектами придется реализовать несколько абстрактных методов, к числу которых относятся utcoffset (смещение по местному времени с UTC), dst (настройка перехода на летнее время), а также функция tzname (имя часового пояса в виде строки).

from datetime import tzinfo, timedelta, datetime, timezone

class UTC(tzinfo):
def __init__(self, offset=18801, name=None):
self.offset = timedelta(seconds=offset)
self.name = name or self.__class__.__name__
def utcoffset(self, dt):
return self.offset
def tzname(self, dt):
return self.name
def dst(self, dt):
return timedelta(0)
now = datetime.now(timezone.utc)
print(now)
b = datetime.now(UTC())
print(b)
print(b.utcoffset())
print(b.tzname())
print(b.dst())
# Вывод:
2021-07-23 06:15:04.711995+00:00
2021-07-23 11:28:25.711995+05:13:21
5:13:21
UTC
0:00:00

Оцените статью
О Python на русском языке
Добавить комментарий

Adblock
detector