Как рассчитать прошедшее время в определенных диапазонах?

У меня есть приложение Laravel, которое по сути обеспечивает бэкэнд для игры. Эта игра охватывает несколько дней, но только определенные часы в течение каждого дня. В идеале, я бы хотел, чтобы экран отображал "прошедшее время", но я хочу, чтобы этот дисплей учитывал только время в игре, а не время с начала игры.

Например: эта игра будет работать с понедельника по пятницу с 8:00 до 15:00. Представьте себе, что игра начинается в понедельник в 8:00, если бы это был четверг в 10:00, я бы хотел, чтобы на прошедшем времени показывалось 23:00:00.

Как мне хранить эти диапазоны дат? Не существует верхнего предела количества дней, поэтому я не могу хранить их в многомерном массиве. Как бы вы подошли к этому?

1 ответ

Решение
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:00 в четверг, вычтите 23.

Другие вопросы по тегам