В модуле datatime содержатся классы для работы с датой и временем. В частности часто используются datetime для хранения даты и времени некоторого события и timedelta для хранения интервала времени между каким-то двумя событиями.
Удобно работать с datetime и timedelta путем математических операций.
📎 Примеры. Добавить к дате один день, год или отнять 2:20 (функция str тут для человекочитаемого формата):
>>> str(datetime.now() + timedelta(days=1)) '2019-10-06 15:51:09.089691' >>> str(datetime.now() + timedelta(days=365)) '2020-10-04 15:52:04.618896' >>> str(datetime.now() - timedelta(hours=2, minutes=20)) '2019-10-05 13:41:27.617589'
Разница во времени между событиями:
>>> a = datetime.now() >>> b = datetime.now() + timedelta(minutes=5) >>> b - a datetime.timedelta(0, 317, 99915) >>> str(b - a) '0:05:17.099915'
timedelta внутренне хранит только секунды от начала дня и сами дни, хотя в конструкторе принимает дни, секунды, микросекунды, миллисекунды, минуты, часы и недели (можно выбрать любые их сочетания для задания интервала):
datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0) >>> str(timedelta(days=1, hours=2, milliseconds=333)) '1 day, 2:00:00.333000'
Причем мы не обязаны нормализовывать аргументы: он сам поймет, что 200 минут – это 3 часа 20 минут:
>>> str(timedelta(minutes=200)) '3:20:00'
Достать часы и минуты (странно, что у объекта нет свойств hours и minutes):
def hours_minutes(td): return td.seconds // 3600, (td.seconds // 60) % 60 >>> hours_minutes(timedelta(0, 12345)) (3, 25)
Сколько всего секунд в интервале:
>>> timedelta(minutes=200, seconds=21, hours=25).total_seconds() 102021.0
Можно даже умножать timedelta на числа или поделить два timedelta или взять остаток. Допустим рабочая смена длится 7 часов 30 минут, сколько полных смен в 3-х сутках?
>>> a = timedelta(days=3) >>> b = timedelta(hours=7, minutes=30) >>> a // b 9 >>> str(a % b) '4:30:00'
Ответ 9 полных смен и еще останется 4 часа 30 минут лишних.
Бонус. Формат даты по-нашенскому (ДД.ММ.ГГГГ):
>>> datetime.strftime(datetime.now(), '%d.%m.%Y') '05.10.2019'
🐉 Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈