Utilities.time_utils

Утилиты для работы со временем.

Содержит функции для форматирования временных интервалов и вычисления дат относительно текущего момента.

 1"""
 2Утилиты для работы со временем.
 3
 4Содержит функции для форматирования временных интервалов
 5и вычисления дат относительно текущего момента.
 6"""
 7
 8from datetime import datetime, timedelta
 9
10
11def format_time(seconds):
12    """Форматирует время в секундах в читаемую строку на русском языке.
13
14    Не показывает единицы измерения с нулевыми значениями.
15    Поддерживает правильное склонение: день/дня/дней, час/часа/часов и т.д.
16
17    Args:
18        seconds (int): Количество секунд.
19
20    Returns:
21        str: Отформатированная строка, например "2 часа 30 минут".
22              Если время меньше секунды, возвращает "0 секунд".
23    """
24    if seconds < 0:
25        return "0 секунд"
26
27    intervals = [("день", 86400), ("час", 3600), ("минуту", 60), ("секунду", 1)]
28
29    parts = []
30
31    for name, count in intervals:
32        if seconds >= count:
33            value = seconds // count
34            seconds %= count
35
36            # Пропускаем нулевые значения
37            if value == 0:
38                continue
39
40            # Правильное склонение
41            if name == "день":
42                if value % 10 == 1 and value % 100 != 11:
43                    name = "день"
44                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
45                    name = "дня"
46                else:
47                    name = "дней"
48            elif name == "час":
49                if value % 10 == 1 and value % 100 != 11:
50                    name = "час"
51                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
52                    name = "часа"
53                else:
54                    name = "часов"
55            elif name == "минуту":
56                if value % 10 == 1 and value % 100 != 11:
57                    name = "минута"
58                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
59                    name = "минуты"
60                else:
61                    name = "минут"
62            elif name == "секунду":
63                if value % 10 == 1 and value % 100 != 11:
64                    name = "секунда"
65                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
66                    name = "секунды"
67                else:
68                    name = "секунд"
69
70            parts.append(f"{int(value)} {name}")
71
72    # Если время меньше секунды
73    if not parts:
74        return "0 секунд"
75
76    return " ".join(parts)
77
78
79def time_passed(seconds_ago):
80    """Возвращает дату и время, отстоящие от текущего момента на указанное количество секунд назад.
81
82    Args:
83        seconds_ago (int): Количество секунд назад.
84
85    Returns:
86        datetime: Объект datetime с вычисленной датой и временем.
87    """
88    current_time = datetime.now()
89    target_time = current_time - timedelta(seconds=seconds_ago)
90    return target_time
def format_time(seconds):
12def format_time(seconds):
13    """Форматирует время в секундах в читаемую строку на русском языке.
14
15    Не показывает единицы измерения с нулевыми значениями.
16    Поддерживает правильное склонение: день/дня/дней, час/часа/часов и т.д.
17
18    Args:
19        seconds (int): Количество секунд.
20
21    Returns:
22        str: Отформатированная строка, например "2 часа 30 минут".
23              Если время меньше секунды, возвращает "0 секунд".
24    """
25    if seconds < 0:
26        return "0 секунд"
27
28    intervals = [("день", 86400), ("час", 3600), ("минуту", 60), ("секунду", 1)]
29
30    parts = []
31
32    for name, count in intervals:
33        if seconds >= count:
34            value = seconds // count
35            seconds %= count
36
37            # Пропускаем нулевые значения
38            if value == 0:
39                continue
40
41            # Правильное склонение
42            if name == "день":
43                if value % 10 == 1 and value % 100 != 11:
44                    name = "день"
45                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
46                    name = "дня"
47                else:
48                    name = "дней"
49            elif name == "час":
50                if value % 10 == 1 and value % 100 != 11:
51                    name = "час"
52                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
53                    name = "часа"
54                else:
55                    name = "часов"
56            elif name == "минуту":
57                if value % 10 == 1 and value % 100 != 11:
58                    name = "минута"
59                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
60                    name = "минуты"
61                else:
62                    name = "минут"
63            elif name == "секунду":
64                if value % 10 == 1 and value % 100 != 11:
65                    name = "секунда"
66                elif 2 <= value % 10 <= 4 and (value % 100 < 10 or value % 100 >= 20):
67                    name = "секунды"
68                else:
69                    name = "секунд"
70
71            parts.append(f"{int(value)} {name}")
72
73    # Если время меньше секунды
74    if not parts:
75        return "0 секунд"
76
77    return " ".join(parts)

Форматирует время в секундах в читаемую строку на русском языке.

Не показывает единицы измерения с нулевыми значениями. Поддерживает правильное склонение: день/дня/дней, час/часа/часов и т.д.

Args: seconds (int): Количество секунд.

Returns: str: Отформатированная строка, например "2 часа 30 минут". Если время меньше секунды, возвращает "0 секунд".

def time_passed(seconds_ago):
80def time_passed(seconds_ago):
81    """Возвращает дату и время, отстоящие от текущего момента на указанное количество секунд назад.
82
83    Args:
84        seconds_ago (int): Количество секунд назад.
85
86    Returns:
87        datetime: Объект datetime с вычисленной датой и временем.
88    """
89    current_time = datetime.now()
90    target_time = current_time - timedelta(seconds=seconds_ago)
91    return target_time

Возвращает дату и время, отстоящие от текущего момента на указанное количество секунд назад.

Args: seconds_ago (int): Количество секунд назад.

Returns: datetime: Объект datetime с вычисленной датой и временем.