Извините за мой плохой английский. Я программирую игру с фантастическим свиданием. Например, в каждом месяце ровно 30 дней. Не имеет значения. В сутках, как и в нашем мире, 24 часа, в каждом часе 60 минут и в каждой минуте 60 секунд.
Так. Я хочу определить, открыт ли магазин или нет. Значения в базе выглядят так: открыто с 8 до 18 (например, днем), открыто с 20 до 2 (например, ночью), открыто с… … Проблема не в дне, а в раннем утре часы, потому что они на следующий день.
AventurienDate from, to;
int HourFrom = 18; // shop open from
int HourTo = 8; // shop open to
bool hasopen = false;
AventurienDate now;
now.set(1025, 4, 26, 1); // Year, month, day, hour
from.set(1025, 4, now.Day, HourFrom);
to.set(1025, 4, now.Day, HourTo);
if (from < to || from == to)
hasopen = (from < now || from == now) && (to > now || to == now);
else {
to.addHours(24);
if (now.Hours >= HourFrom && now.Hours <= HourTo)
hasopen = true;
if (hasopen == false)
hasopen = (from < now || from == now) && (to > now || to == now);
}
qDebug() << "now: " << now.toStringDateTime();
qDebug() << "open from: " << from.toStringDateTime();
qDebug() << "open to: " <<to.toStringDateTime();
qDebug() << hasopen;
now: "26. TRA 1025 BF, 01:00:00"
open from: "26. TRA 1025 BF, 18:00:00"
open to: "27. TRA 1025 BF, 08:00:00"
false
Вывод в примере должен быть «истина»! Я не могу найти решение. Кто-нибудь?
Дневной случай, когда даты игнорируются и смотрят только на время, тривиален (from
<= now
<= to
). В C++ это делается с помощью логической операции AND, т.е. from <= now && now <= to
Ночной случай аналогичен, но с полночью посередине, он состоит из двух случаев с ИЛИ: from
<= now
<= midnight (24:00)
или midnight (00:00)
<= now
<= from
.now
<= midnight (24:00)
и midnight (00:00)
<= now
всегда верны и их можно упростить, оставив только выражение, идентичное приведенному выше, но с ИЛИ вместо И.
В результате получается полное логическое выражение:
bool hasOpen = (from <= to /* daytime */ && (from <= now && now <= to))
|| (from > to /*nighttime*/ && (from <= now || now <= to));
Знаете ли вы о заголовке <chrono>? Используйте его для всего, что связано со временем в C++!