diff --git a/src/utils/TimerUtils.py b/src/utils/TimerUtils.py new file mode 100644 index 0000000..ffecafb --- /dev/null +++ b/src/utils/TimerUtils.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +""" +Copyright (c) 2025 - 2026 KenanZhu. +All rights reserved. + +This software is provided "as is", without any warranty of any kind. +You may use, modify, and distribute this file under the terms of the MIT License. +See the LICENSE file for details. +""" +from datetime import datetime, timedelta + + +def calculateNextRepeatTime( + repeat_days: list, + hour: int, + minute: int, + second: int +) -> datetime: + """ + Calculate the next repeat time based on repeat days and target time. + + This function calculates the next execution time for a repeatable task. + If the current day is in repeat_days and the target time has not passed, + it returns today's target time. Otherwise, it finds the next matching day. + + Args: + repeat_days (list): List of weekdays to repeat (0=Monday, 6=Sunday). + hour (int): Target hour (0-23). + minute (int): Target minute (0-59). + second (int): Target second (0-59). + + Returns: + datetime: The next repeat execution time. + """ + + current_time = datetime.now() + current_weekday = current_time.weekday() + target_time = current_time.replace(hour=hour, minute=minute, second=second, microsecond=0) + if current_weekday in repeat_days: + if target_time > current_time: + return target_time + repeat_days_sorted = sorted(repeat_days) + for day in repeat_days_sorted: + if day > current_weekday: + days_until = day - current_weekday + next_time = target_time + timedelta(days=days_until) + return next_time + days_until = 7 - current_weekday + repeat_days_sorted[0] + next_time = target_time + timedelta(days=days_until) + return next_time