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 с вычисленной датой и временем.