Шаг 56.
Python: сборник рецептов. Числа, даты и время. Перевод дней в секунды и другие базовые методы конвертации времени

    На этом шаге мы рассмотрим возможности модулей datetime и dateutil.

Задача

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

Решение

    Чтобы производить конвертирование и арифметические операции над различными единицами времени, используйте модуль datetime. Например, чтобы представить интервал времени, создайте экземпляр timedelta:

>>> from datetime import timedelta
>>> a = timedelta(days=2, hours=6)
>>> b = timedelta(hours=4.5)
>>> c = a + b
>>> c.days
2
>>> c.seconds
37800
>>> c.seconds / 3600
10.5
>>> c.total_seconds() / 3600
58.5
>>> 

    Если вам нужно представить определенные даты и определенное время, создайте экземпляры datetime и проводите над ними обычные арифметические операции. Например:

>>> from datetime import datetime
>>> a = datetime(2012, 9, 23)
>>> print(a + timedelta(days=10))
2012-10-03 00:00:00
>>> 
>>> b = datetime(2012, 12, 21)
>>> d = b - a
>>> d.days
89
>>> now = datetime.today()
>>> print(now)
2026-03-31 13:44:33.533476
>>> print(now + timedelta(minutes=10))
2026-03-31 13:54:33.533476
>>> 

    Стоит отметить, что datetime знает о существовании високосных годов. Например:

>>> a = datetime(2012, 3, 1)
>>> b = datetime(2012, 2, 28)
>>> a - b
datetime.timedelta(days=2)
>>> (a - b).days
2
>>> c = datetime(2013, 3, 1)
>>> d = datetime(2013, 2, 28)
>>> (c - d).days
1
>>> 


Обсуждение

    Для самых базовых операций над датой и временем модуля datetime достаточно. Если перед вами стоят более сложные задачи, такие как работа с временными зонами, нечеткими интервалами времени, подсчет дат выходных дней и т. д., посмотрите на модуль dateutil.


https://pypi.org/project/python-dateutil/.

    Например, многие подобные вычисления над временем могут быть выполнены с помощью функции dateutil.relativedelta(). Одна важная возможность заключается в том, что она заполняет разрывы, которые возникают при работе с месяцами (и отличающимся количеством дней в них). Например:

>>> a = datetime(2012, 9, 23)
>>> a + timedelta(months=1)
Traceback (most recent call last):
.   .   .   .
TypeError: 'months' is an invalid keyword argument for this function 
>>>
>>> from dateutil.relativedelta import relativedelta 
>>> a + relativedelta(months=+1) 
datetime.datetime(2012, 10, 23, 0, 0)
>>> a + relativedelta(months=+4) 
datetime.datetime(2013, 1, 23, 0, 0)
>>>
>>> # Время между двумя датами 
>>> b = datetime(2012, 12, 21)
>>> d = b - a 
>>> d
datetime.timedelta(89)
>>> d = relativedelta(b, a)
>>> d
relativedelta(months=+2, days=+28)
>>> d.months 
2
>>> d.days
28
>>>

    На следующем шаге мы рассмотрим определение даты последней пятницы.




Предыдущий шаг Содержание Следующий шаг