Проверка на вхождение в временной интервал

AntonBizen

Client
Регистрация
17.09.2015
Сообщения
11
Благодарностей
1
Баллы
3
Приветствую всех. Ребята, помогите плиз, может кто видел где, нужен код на C#, проверка - входит ли TimeNow в промежуток, указанный 2 переменными(TimeStart, TimeEnd), и возвращает значение - да или нет? чувствую что это пару строк на шарпе, не хочется кучу экшенов писать в шабе, потому что проверок в шаблоне много требуется. Я вообще в С# не бум бум. Мучился с пару часов, задолбался, решил спросить, может где есть подобное решение. На этом форуме нашёл только как получить время сейчас return DateTime.Now.ToString("hh:mm");
 

AntonBizen

Client
Регистрация
17.09.2015
Сообщения
11
Благодарностей
1
Баллы
3
Вот нашёл на одном сайте:
Код:
static class TimeSpanExtensions
{
    static public bool IsBetween(this TimeSpan time,
                                  TimeSpan startTime, TimeSpan endTime)
    {
        if (endTime == startTime)
        {
            return true;
        }

        if (endTime < startTime)
        {
            return time <= endTime ||
                time >= startTime;
        }

        return time >= startTime &&
            time <= endTime;
    }
}
Код:
if (!DateTime.Now.TimeOfDay.IsBetween(new TimeSpan(19, 0, 0), new TimeSpan(6, 0, 0)))
            {
                Console.WriteLine("Добро пожаловать!");
            }
            else
            {
                Console.WriteLine("Извените, сейчас мы закрыты. Время работы - с 9 з 19.");
            }
Но не знаю как в зенке это реализовать.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
в каком виде хранятся данные о TimeStart и TimeEnd?
 

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Попробуй
C#:
Func<TimeSpan, TimeSpan,TimeSpan, bool> IsBetween;
            IsBetween = (time, startTime, endTime) =>
            {
                if (endTime == startTime)
                {
                    return true;
                }
                if (endTime < startTime)
                {
                    return time <= endTime ||
                        time >= startTime;
                }
                return time >= startTime &&
                    time <= endTime;
            };

            var result = IsBetween(new TimeSpan(19, 0, 0), new TimeSpan(6, 0, 0), new TimeSpan(7, 0, 0));
 
  • Спасибо
Реакции: AntonBizen

AntonBizen

Client
Регистрация
17.09.2015
Сообщения
11
Благодарностей
1
Баллы
3
в каком виде хранятся данные о TimeStart и TimeEnd?
Вообще должны указываться в входных настройках, думаю в виде номера - указывать часы от и до.
Было бы здорово если бы в зенке был тип "время" в входящих настройках, я не нашёл по крайней мере подобного.

Нужно чтобы определённое действие не выполнялось в шабе в установленное время. Шаб постоянно работает, а пользователь иногда меняет этот интервал под свои нужды. Допустим он выставил от 17 до 20, шаб проверяет постоянно время сейчас и если сейчас 19 часов, то не выполняет опред. действие.
 

AntonBizen

Client
Регистрация
17.09.2015
Сообщения
11
Благодарностей
1
Баллы
3

Radzhab

Client
Регистрация
23.05.2014
Сообщения
1 500
Благодарностей
1 268
Баллы
113
Ни логов) ни скринов)
 

AntonBizen

Client
Регистрация
17.09.2015
Сообщения
11
Благодарностей
1
Баллы
3
Ни логов) ни скринов)
Да честно говоря, я не понимаю куда там данные вставлять. Толку то что я вставил в экшен C# и запустил.)

В двух переменных TimeStart и TimeEnd указаны часы начала и конца временного интервала (именно в часах, потому что с минутами я вообще не знаю как это будет, но если возможно, это было бы вообще круто) - эти значения указываются в входных настройках и часто будут меняться.

Задача такая: Шаб проверяет текущее время и если оно попадает в этот интервал, то сниппет возвращает "no" и благодаря ifу определённый кусок шаба не выполняется.

В твоем коде я по разному переменные вставлял, один из вариантов:
Код:
 var result = IsBetween(new TimeSpan(project.Variables["hourNow"].Value, 0, 0), new TimeSpan(project.Variables["hourStart"].Value, 0, 0), new TimeSpan(project.Variables["hourEnd"].Value, 0, 0));
Понимаю, наверное смех вызывает, но я предупреждал что в программировании вообще не понимаю.
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Для начала стоит показать значения переменных TimeStart и TimeEnd, именно так они там записываются, а не "указаны часы начала и конца временного интервала"
 
  • Спасибо
Реакции: AntonBizen

AntonBizen

Client
Регистрация
17.09.2015
Сообщения
11
Благодарностей
1
Баллы
3
Для начала стоит показать значения переменных TimeStart и TimeEnd, именно так они там записываются, а не "указаны часы начала и конца временного интервала"
01 ... 24
Например TimeStart - 09 , TimeEnd - 12
Это если только в часах, а если возможно сделать с минутами, то соответственно TimeStart - 09:00 , TimeEnd - 12:00
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Без минут самый простой вариант, имхо, такой:
C#:
var timeStart = Convert.ToInt32(project.Variables["TimeStart"].Value);
var timeEnd = Convert.ToInt32(project.Variables["TimeEnd"].Value);

if (timeStart < DateTime.Now.Hour &&  timeEnd > DateTime.Now.Hour) return null; // Часы вне диапазона, выходим с ошибкой
return 1; // Все ок
С минутами надо более расширенный, т.к. надо парсить часы и минуты, проверять на валидность, особенно если учитывать что могут быть только часы без минут, или кривые минуты и т.п.
Код будет чуть побольше и продумывать, если честно, желания нет, если оочень сильно надо сделаю (или я или может еще кто заглянет), но это все такое, по времени ))
 
Последнее редактирование:
  • Спасибо
Реакции: AntonBizen

AntonBizen

Client
Регистрация
17.09.2015
Сообщения
11
Благодарностей
1
Баллы
3
Без минут самый простой вариант, имхо, такой:
Спасибо большое! Выручил! Работает отлично.
Вот что значит сниппет, коротко и ёмко, а то я столько много экшеннов лепил - и регулярки и логику)
 

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
а с датами подскажите мне пожалуйста?
даты в формате dd.mm.yyyy

на входе три значения:
datestart > dateitem > datefinish
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
а с датами подскажите мне пожалуйста?
даты в формате dd.mm.yyyy

на входе три значения:
datestart > dateitem > datefinish
C#:
var dateStart = DateTime.ParseExact(project.Variables["datestart"].Value, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
var dateEnd = DateTime.ParseExact(project.Variables["datefinish"].Value, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);
var currentDate = DateTime.ParseExact(project.Variables["dateitem"].Value, "dd.MM.yyyy", System.Globalization.CultureInfo.InvariantCulture);

if (dateStart.ToFileTimeUtc() < currentDate.ToFileTimeUtc() && dateEnd.ToFileTimeUtc() > currentDate.ToFileTimeUtc()) return null;
return 1;
Как-то так
 
  • Спасибо
Реакции: daymos

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
Последнее редактирование:

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
спасибо!
но, как не кручу - всегда "1"



и местами менял, и знаки менял
https://www.sendspace.com/file/64a1ev шаб
Проверил все работает, ответ 1 приходит если совпадений нет, если дата будет между указанными датами (не включая их) то снипет выйдет по ошибке, если надо наоборот то поменять местами ретурны надо.
Если надо чтобы даты старт и енд включались заменяем < и > на <= и >=
 
  • Спасибо
Реакции: daymos

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
изменилось задание (
Надо дату "November 16, 2015" конвертировать в юникстайм и сравнить с другим юникстайм лежащем в переменной.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
Код:
Int32 unixTime = (Int32)(DateTime.Parse(project.Variables["datestart"].Value).Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
return unixTime;
работает, всем спасибо кто смотрел телевизор в то время когда я тут страдал:dy:
 

svaminar

Client
Регистрация
21.08.2013
Сообщения
834
Благодарностей
379
Баллы
63
блин
а ведь можно било взять дату в юникс формате. и простим ява скриптом стравнивать.
Только теперь допер
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Код:
Int32 unixTime = (Int32)(DateTime.Parse(project.Variables["datestart"].Value).Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
return unixTime;
работает, всем спасибо кто смотрел телевизор в то время когда я тут страдал:dy:
:D
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Код:
Int32 unixTime = (Int32)(DateTime.Parse(project.Variables["datestart"].Value).Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
return unixTime;
работает, всем спасибо кто смотрел телевизор в то время когда я тут страдал:dy:
Фильм просто класный шёл))) только честно не помню даже о чём )))
 

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
опять я!
надо добавить минуты, секунды (

November 16, 2015 @ 20:15:00

как не кручу - не выходит

Код:
Int32 itemdate = (Int32)(DateTime.Parse(project.Variables["itemdatefull"].Value).Subtract(new DateTime(1970,1,1,0,0,0, DateTimeKind.Utc)));
return itemdate;
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Ну так прочитай про метод, гугл же есть
http://www.dotnetperls.com/datetime-parse
http://www.dotnetperls.com/datetime-format
Один раз разберешься, не будет возникать вопросов.

string dateString = "Mon 16 Jun 8:30 AM 2008"; // Modified from MSDN
string format = "ddd dd MMM h:mm tt yyyy";

DateTime dateTime = DateTime.ParseExact(dateString, format,
CultureInfo.InvariantCulture);
 
  • Спасибо
Реакции: daymos

daymos

Client
Регистрация
11.11.2009
Сообщения
806
Благодарностей
240
Баллы
43
Код:
string dateString = "November 16 2015 20:15:00";
string format = "MMMM dd yyyy HH:mm:ss";
DateTime itemdate = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
TimeSpan span = itemdate.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
и директивы надо добавить using System.Globalization;
добил вроде.
Спасибо rostonix
 
Последнее редактирование:

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 715
Баллы
113
Код:
string dateString = "November 16 2015 20:15:00";
string format = "MMMM dd yyyy HH:mm:ss";
DateTime itemdate = DateTime.ParseExact(dateString, format, CultureInfo.InvariantCulture);
TimeSpan span = itemdate.Subtract(new DateTime(1970,1,1,0,0,0));
return span.TotalSeconds;
и директивы надо добавить using System.Globalization;
добил вроде.
Спасибо rostonix
Молодчик) Надеюсь сам сделал :-)
 

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