Подскажите алгоритм расчета времени до начала определенного часа

Djuli1337

Client
Регистрация
28.09.2019
Сообщения
61
Благодарностей
9
Баллы
8
Добрый день. Подскажите алгоритм, как лучше сделать.
На одном веб ресурсе можно делать взаимодействия с юзерами только в определенное время(это время указывают юзеры ресурса).

На входных параметрах может быть следующее, - пользователь разрешил взаимодействовать только с 14:00 до 00:00 часов, а текущее время 2:30.
А на выходе алгоритм должен сказать, сколько минут осталось до того времени, чтобы взаимодействовать.
Соответственно, время может быть любое(логично, что время может быть с 14:00 до 13:00, то есть все время можно взаимодействовать, кроме интервала с 13 до 14 часов)

Правильно ли будет сделать следующее - сравнить начальное время(с) и текущее время.
Если начальное > текущего, то отнимаем начальное от текущего
Если начальное < текущего, то отнимаем текущее от начального.

Что делать в тех случаях, когда юзер указал, что можно взаимодействовать с 00:00 до 01:00 , а текущее время 2:30
По логике нужно будет 2:30 отнять 00:00 и будет , что до взаимодействия осталось 2:30(150минут), что неверно.

Может тогда если будет 00 , то его переводить в 24 и только после этого проводить такую операцию?
Может, еще какие-то подводные камни могут быть?
 
  • Спасибо
Реакции: Alexmd

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
Согласно Вашей задаче - указан диапазон 14-00 - 0-00.
Вы упускаете, что время не может существовать без привязки к дате.
Таким образом, диапазон будет уже:
7-10-2021 14-00 до 8-10-2021 00-00

А это значит, что мы можем эти даты перевести например в секунды.
Получится что-то вроде: 1633615200 до 1633651200
Далее, по задаче Вы говорите например о времени 2:30.
Допустим, мы говорим о дате 7-10-2021 2-30
Переводим в секунды - получается 1633573800

А далее уже сравниваем так, как Вы собирались сравнивать - если мы находимся/не находимся внутри диапазона - значит всё ок, иначе - ждём указанное количество секунд.
 
  • Спасибо
Реакции: Alexmd

Djuli1337

Client
Регистрация
28.09.2019
Сообщения
61
Благодарностей
9
Баллы
8
Спасибо за ответ. Ранее учился на ваших видеороликах, которые вы записывали "чтобы самому научиться".:ay:

Да, перевод в секунд выглядит привлекательным решением. Как тогда преобразовать диапазон 14-00 - 0-00 в 7-10-2021 14-00 до 8-10-2021 00-00 ?
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
Да, перевод в секунд выглядит привлекательным решением. Как тогда преобразовать диапазон 14-00 - 0-00 в 7-10-2021 14-00 до 8-10-2021 00-00 ?
C#:
string line = "14-00 - 0-00";
// первое значение часы, второе минуты, третье часы, четвертое минуты
// Разбиваем строку на отдельные значения
int[] d = line.Trim().Split('-').Select(x=>int.Parse(x.Trim())).ToArray(); // 14 0 0 0

DateTime today1 = DateTime.Today; // Получаем текущую дату время
int seconsnow = (int)(today1.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; // переводим текущее время в секунды

DateTime datestart = new DateTime(today1.Year, today1.Month, today1.Day, d[0],d[1], 0); // формируем первую дату диапазона
int seconsdstart = (int)datestart.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; // переводим в секунды

DateTime today2 = DateTime.Today;
if(d[0]>d[2])  today2 =today2.AddDays(1); // если вторые часы меньше значения первых часов - значит вторая дата - следующий день
DateTime dateend = new DateTime(today2.Year, today2.Month, today2.Day, d[2],d[3], 0); // формируем вторую дату диапазона

int seconsend = (int)(dateend.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; // переводим в секунды

project.SendInfoToLog(string.Format(@"{0} {1} {2}", seconsnow, seconsdstart, seconsend),true); // выводим все полученные значения в лог
1633564800 1633615200 1633651200
 
Последнее редактирование:
  • Спасибо
Реакции: Djuli1337

Djuli1337

Client
Регистрация
28.09.2019
Сообщения
61
Благодарностей
9
Баллы
8
C#:
string line = "14-00 - 0-00";
// первое значение часы, второе минуты, третье часы, четвертое минуты
// Разбиваем строку на отдельные значения
int[] d = line.Trim().Split('-').Select(x=>int.Parse(x.Trim())).ToArray(); // 14 0 0 0

DateTime today1 = DateTime.Today; // Получаем текущую дату время
int seconsnow = (int)(today1.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; // переводим текущее время в секунды

DateTime datestart = new DateTime(today1.Year, today1.Month, today1.Day, d[0],d[1], 0); // формируем первую дату диапазона
int seconsdstart = (int)datestart.Subtract(new DateTime(1970, 1, 1)).TotalSeconds; // переводим в секунды

DateTime today2 = DateTime.Today;
if(d[0]>d[2])  today2 =today2.AddDays(1); // если вторые часы меньше значения первых часов - значит вторая дата - следующий день
DateTime dateend = new DateTime(today2.Year, today2.Month, today2.Day, d[2],d[3], 0); // формируем вторую дату диапазона

int seconsend = (int)(dateend.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; // переводим в секунды

project.SendInfoToLog(string.Format(@"{0} {1} {2}", seconsnow, seconsdstart, seconsend),true); // выводим все полученные значения в лог
1633564800 1633615200 1633651200
Премного благодарен. Буду пробовать внедрять в проект!
 

Alexmd

Client
Регистрация
10.12.2018
Сообщения
1 021
Благодарностей
1 387
Баллы
113
Так как количество минут в сутках статичное 24*60, то использовать DateTime для переходов нахожу лишним. Тут же просто математические действия..
C#:
string data = "10:00-22:00";//входные данные
const int M = 24*60;//минут в сутках
int minutesFromDayStart = DateTime.Now.Hour*60 + DateTime.Now.Minute;//высчитаю сколько минут прошло с начала суток
//рассплитовка и расчет диапазона по переменным
int start = int.Parse(data.Split('-')[0].Split(':')[0])*60+int.Parse(data.Split('-')[0].Split(':')[1]);
int end = int.Parse(data.Split('-')[1].Split(':')[0])*60+int.Parse(data.Split('-')[1].Split(':')[1]);
//выход по условиям
if(minutesFromDayStart >= start && minutesFromDayStart <= end){
    return "Remaining " + (end - minutesFromDayStart) + " min";
}
else if(minutesFromDayStart < start){
    return "Wait " + (start - minutesFromDayStart) + " min.";
}
else return "Wait " + (start+(M-minutesFromDayStart)) + " min.";
Если диапазон по дням недели, то это можно так же статично рассчитать в инты.
Но если будут такие подводные камни, когда взаимодействие может происходить раз в месяц, там уже придется парсить даты, чтобы не пропустить разницу в количестве дней в разные месяцы.
@BAZAg, я без камней в огороды, просто люблю задачки)
 
  • Спасибо
Реакции: BAZAg

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 767
Благодарностей
2 414
Баллы
113
@BAZAg, я без камней в огороды, просто люблю задачки)
Ничего не имею против - было время, набросал код (когда больше желающих не было помочь решить проблему).
Уверен, что есть ещё много других способов решить ту же задачку :-)

Что касается "просто люблю задачки" - можете помочь подсчитать хеши, вдруг получится считать быстрее, чем мне уже получилось. Приглашаю в тему: https://zennolab.com/discussion/threads/kak-uskorit-podschjot-sha256.96580/
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)