Самый эффективный способ корректировки значения

Я работаю над системой, которая запускает процесс на основе заданного значения времени (startHour). Пользователь устанавливает час начала и может выбирать только значения от 00 до 23. Меня попросили начать один и тот же процесс с интервалом в 6 часов, чтобы он повторялся 4 раза в течение дня.

Я изначально хотел добавить еще три переменные: SecondStartHour, ThirdStartHour и FourStartHour. SecondStartHour будет присвоено значение на 6 часов раньше startHour, ThirdstartHour — на 12 часов раньше startHour, а fourStartHour — на 18 часов раньше startHour. Затем я мог бы использовать любую переменную startHour для запуска процесса.

Я написал код (ниже), который будет работать, но мне интересно, есть ли лучший и более эффективный способ сделать это.

//устанавливаем второйStartHour на 6 часов раньше startHour
if (startHour <= 5)
{
    secondStartHour = startHour - 18;
}
else
{
    secondStartHour = startHour + 6;
}

//устанавливаем ThirdStartHour на 12 часов раньше startHour
if (startHour <= 11)
{
    thirdStartHour = startHour - 12;
}
else
{
    thirdStartHour = startHour + 12;
}

//устанавливаем fourStartHour на 18 часов раньше startHour
if (startHour <= 17)
{
    fourthStartHour = startHour - 6;
}
else
{
    fourthStartHour = startHour + 18;
}

Мне пришлось написать код так, как я это сделал выше, потому что я работаю с 24-часовым форматом времени, поэтому в некоторых случаях добавление времени к startHour фактически уменьшит его значение. Под этим я подразумеваю, что если startHour равен 23 (23:00), и мне нужно добавить к нему 6 часов, чтобы получить второйStartHour, результат будет 5 (05:00), поэтому я не могу просто написать код, чтобы сказать SecondStartHour = startHour + 6. Код кажется слишком длинным и запутанным, но я не могу придумать лучшего способа его написать. Я мог бы использовать оператор выбора случая, но тогда у меня было бы 24 случая с назначениями для каждой из новых переменных в каждом случае, так что это кажется хуже, любые идеи будут оценены по достоинству.

, 👍1

Обсуждение

Если подумать – если это происходит 4 раза в день через равные промежутки времени, то на самом деле у вас может быть только 6 стартов…, @Majenko

Привет, Маженко, спасибо за ответ, но это не так, поскольку пользователь выбирает период времени, в который он хочет, чтобы произошел первый процесс., @user1649972

Но это противоположно тому, что вы говорите в своем вопросе: «Меня попросили запустить один и тот же процесс с интервалом в 6 часов, чтобы он происходил 4 раза в течение дня»., @Majenko

Да, каждые 6 часов, но это основано на том факте, что «Пользователь устанавливает час начала и может выбирать только значения от 00 до 23». То есть каждые 6 часов, но меняется в зависимости от выбранного времени., @user1649972

Да, но какая разница между вводом 4 и вводом 10?, @Majenko


2 ответа


Лучший ответ:

1

Вместо сравнения вы можете использовать оператор по модулю:

 secondStartHour = (startHour +  6) % 24;

И то же самое для остальных:

 thirdStartHour  = (startHour + 12) % 24;
 fourthStartHour = (startHour + 18) % 24;

Пока xxxStartHour >= 24, 24 будет удаляться до тех пор, пока не окажется в диапазоне [0, 24).

Если вам нужно смещение, вы также можете добавить несколько часов курса после модуля (я не совсем понимаю ваш пример, который может иметь значения >= 24.

Кроме того, если вам нужно выполнять одну и ту же задачу каждые 6 часов, вы можете использовать один раз и «перезапускать» ее каждые 6 часов (и, возможно, с учетом летнего/зимнего времени).

,

Большое спасибо, Мишель, оператор мода - это именно то, что мне нужно, он сделает код намного короче и чище. еще раз спасибо, @user1649972

Пожалуйста. Вы можете использовать его во многих случаях, которые связаны с чем-то периодическим., @Michel Keijzers


1

Если подумать логически, у вас на самом деле есть только 6 стартовых часов. Дела могут начинаться только в период с 0 до 5 утра включительно. Все остальное кратно 6 часам с этого момента. Любое время после 5 утра фактически является будущим временем более раннего времени начала.

Таким образом, вы можете просто «модулировать» заданное время, чтобы оно было одним из первых 6 часов дня:

startHour = startHour % 6;

А затем каждый раз прибавляйте 6 для остальных часов:

secondStartHour = startHour + 6;
thirdStartHour = startHour + 12;
fourthStartHour = startHour + 18;

Таким образом, ваше расписание часов может быть только:

0  6  12  18
1  7  13  19
2  8  14  20
3  9  15  21
4 10  16  22
5 11  17  23

Если вы указали 15-й час в качестве времени начала, 15 % 6 равно 3 (разделите 15 на 6, вы получите 2 с оставшимися 3), то есть вы находитесь в шаблоне времени «3 9 15 21».

>
,