Работа с классом datetime
в Python позволяет эффективно управлять датами и временем, что особенно полезно в различных приложениях — от простых скриптов до сложных систем управления. Основной класс, с которым мы взаимодействуем, — это datetime
, который включает в себя как дату, так и время. С помощью этого класса можно легко выполнять операции, такие как сравнение, арифметические вычисления с датами и форматирование.
Создание объекта datetime
возможно с помощью нескольких методов. Наиболее распространённый способ — использование конструктора, где можно указать год, месяц, день, час, минуты и секунды. Например, datetime(2023, 10, 1, 12, 30)
создаст объект, представляющий 1 октября 2023 года в 12:30. Кроме того, модуль datetime
включает в себя классы date
, time
и timedelta
, каждый из которых подходит для специфических задач.
Чтобы начать работать с этим классом, его нужно сперва импортировать. Предпочтительнее импортировать как показано ниже
from datetime import datetime
datetime(2023, 4, 16, 12, 30, 45, 500000)
Но можете встретить и такой вариант импортирования
import datetime
datetime.datetime(2023, 4, 16, 12, 30, 45, 500000)
Вызовем справку этого класса:
Обратите внимание здесь нужно на следующие вещи:
datetime
наследуется от класса date
hour
. Это значит, что все параметры до hour
являются обязательными.Давайте перечислим все параметры с их описанием:
year
- год (от 1 до 9999), является обязательным для заполнения
month
- месяц (от 1 до 12), является обязательным для заполнения
day
- день (от 1 до 31), является обязательным для заполнения
hour
- часы (от 0 до 23), является необязательным параметром. Если не указан, по умолчанию он будет равен 0
minute
- минуты (от 0 до 59), является необязательным параметром. Если не указан, по умолчанию он будет равен 0
second
- секунды (от 0 до 59), является необязательным параметром. Если не указан, по умолчанию он будет равен 0
microsecond
- микросекунды (от 0 до 999999), по умолчанию 0;
tzinfo
- информация о часовом поясе (объект типа datetime.timezone
), по умолчанию None
.
Значит для создания объекта datetime
мы можем передавать разное количество аргументов, но минимум три (год, месяц и день). Давайте взглянем на эти варианты:
my_date1 = datetime(2023, 4, 16)
print(my_date1) # 2023-04-16 00:00:00
my_date2 = datetime(2023, 4, 16, 10, 30)
print(my_date2) # 2023-04-16 10:30:00
my_date3 = datetime(2023, 4, 16, 10, 30, 15)
print(my_date3) # 2023-04-16 10:30:15
Обратите внимание, что datetime.datetime
по умолчанию выводится в определенном формате:
Соответствует следующему формату
YYYY-MM-DD HH:MM:SS
Если присутствуют миллисекунды формат будет в таком виде
YYYY-MM-DD HH:MM:SS.mmmmmm
Как и в случаях с датой и временем вы должны передать только допустимые значения для аргументов. При попытке создать datetime.datetime
с невалидными(неправильными) значениями вы увидите ошибку.
Также datetime.datetime
можно создавать при помощи передачи значений в именованные атрибуты. Но не забывайте про обязательные атрибуты, которые нужно передать в любом случае:
from datetime import datetime
date1 = datetime(month=4, day=16, year=2023)
print(date1)
date2 = datetime(year=2023, month=4, day=16,
minute=30, second=15)
print(date2)
date3 = datetime(year=2023, month=4, day=16,
hour=10, minute=30, second=15)
print(date3)
date4 = datetime(hour=10, minute=30, year=2023,
microsecond=500000, month=4, day=16, second=15, )
print(date4)
Объект datetime
имеет сразу все свойства, которые были отдельно у времени и у даты, а именно:
year
month
day
hour
minute
second
microsecond
Проверим работу:
from datetime import datetime
full_datetime = datetime(
month=12, day=31, year=2005,
minute=21, second=10, hour=4,
microsecond=7)
print(full_datetime.year)
print(full_datetime.month)
print(full_datetime.day)
print(full_datetime.hour)
print(full_datetime.minute)
print(full_datetime.second)
print(full_datetime.microsecond)
Данные свойства предоставляют доступ к перечисленным атрибутам только на чтение. Запись в объект datetime
новое значение не получится. Объект datetime
является неизменяемым объектом. Вы получите ошибку, если попробуйте через присвоение изменить значение у текущего объекта.
При помощи атрибута .max
вы можете получить значение максимальной даты и времени, которое равно 31 декабря 9999 года 23:59:59.999999, а при помощи атрибута .min
- значение минимальной даты, которое равно 1 января 1 года 00:00:00.
Обращаться к этим атрибутам можно как через сам класс datetime
, так и через экземпляры объекта datetime
.
from datetime import datetime
print(datetime.min)
print(datetime.max)
print('-------')
При помощи данных методов можно получить значение текущей даты и времени. Метод .today()
унаследован от класса date
, метод .now()
является своим собственным методом для класса datetime
и его использование является предпочтительнее
from datetime import datetime
print('Today is :', datetime.now())
print()
print('Today is :', datetime.today())
Объект datetime
представляет собой комбинацию времени и даты. Если вы хотите получить одну составляющую отдельно от другой (либо только дату или только время), то можете воспользоваться методами .date()
и .time()
. Соответственно метод .date()
позволит получить дату, метод .time()
- время.
from datetime import datetime
dt = datetime(2015, 8, 21, 10, 5, 30)
print(dt, type(dt))
only_date = dt.date()
print('Only date', only_date, type(only_date))
only_time = dt.time()
print('Only time', only_time, type(only_time))
Обратите внимание на тип данных, метод .date()
возвращает экземпляр даты, а метод .time()
- экземпляр времени.
При помощи метод .date()
и .time()
мы одно общее значение могли разбить на две составляющие. А метод .combine()
выполняет обратную операцию: он позволяет отдельно из даты и отдельно из времени создать объект дата-время
from datetime import date, time, datetime
my_date = date(2015, 8, 21)
my_time = time(10, 5, 30)
dt = datetime.combine(my_date, my_time)
print(dt, type(dt)) # 2015-08-21 10:05:30 <class 'datetime.datetime'>
Метод replace()
также разбирали в уроке про класс date. Здесь имеет ровно такое же поведение, только количество атрибутов для изменения в отличии от даты увеличилось. Стали доступны еще часы, минуты, секунды. Метод replace()
не изменяет оригинальный объект, а возвращает новый объект типа datetime
измененными значениями атрибутов.
from datetime import datetime
now = datetime.now()
print('Сегодня:', now). # Сегодня: 2024-10-20 12:25:02.174479
new_date = now.replace(day=14, year=2014, second=5)
print(new_date, type(new_date)) # 2014-10-14 12:25:05.174479 <class 'datetime.datetime'>
print(now.replace(month=1)) # 2024-1-20 12:25:05.174479