如何计算特定范围内的运行时间


How do I calculate elapsed time within certain ranges?

我有一个Laravel应用程序,它本质上为游戏提供了后端。这个游戏持续数天,但每天只有特定的时间。理想情况下,我希望有一个"时间流逝"的显示器,但我希望这个显示器只计算游戏中的时间,而不是自开始以来的时间。

例如:此游戏将于周一至周五上午8点至下午3点运行。假设比赛在周一上午8点开始,如果是周四上午10点,我希望时间显示为23:00:00。

我应该如何存储这些日期时间范围?天数没有上限,所以我不能将它们存储在多维数组中。你会如何处理这个问题?

function get_hours_elapsed($day, $hour) {
    $time_start = 8; // 8am;
    $time_end = 15; // 3pm
    $day_start = 1; // Mon
    $day_end = 5; // Fri
    $days_elapsed = max(min($day, $day_end) - $day_start, 0);
    $hours_elapsed = $days_elapsed * ($time_end - $time_start);
    $hours_elapsed += max(min($hour, $time_end) - $time_start, 0);
    return $hours_elapsed;
}
var_dump(get_hours_elapsed(
    date("N"), // 0 - 6, 0 being Sunday
    date("G") // 0 - 23
)); // actual time
var_dump(get_hours_elapsed(4, 10)); // 10 am on a Thursday

由于对我来说是星期三下午5点,所以打印:

int(21);
int(23);

如果时间持续数周,只需添加num_weeks * total_hours_in_week小时。

如果计时器在周一上午8点没有启动,则减去小时数。因此,如果它在星期四上午10点开始,减去23。