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

  • Автор темы Автор темы AntonBizen
  • Дата начала Дата начала

AntonBizen

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

Но не знаю как в зенке это реализовать.
 
в каком виде хранятся данные о TimeStart и TimeEnd?
 
Попробуй
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
в каком виде хранятся данные о TimeStart и TimeEnd?
Вообще должны указываться в входных настройках, думаю в виде номера - указывать часы от и до.
Было бы здорово если бы в зенке был тип "время" в входящих настройках, я не нашёл по крайней мере подобного.

Нужно чтобы определённое действие не выполнялось в шабе в установленное время. Шаб постоянно работает, а пользователь иногда меняет этот интервал под свои нужды. Допустим он выставил от 17 до 20, шаб проверяет постоянно время сейчас и если сейчас 19 часов, то не выполняет опред. действие.
 
Ни логов) ни скринов)
Да честно говоря, я не понимаю куда там данные вставлять. Толку то что я вставил в экшен 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));
Понимаю, наверное смех вызывает, но я предупреждал что в программировании вообще не понимаю.
 
Для начала стоит показать значения переменных TimeStart и TimeEnd, именно так они там записываются, а не "указаны часы начала и конца временного интервала"
 
  • Оценить
Реакции: AntonBizen
Для начала стоит показать значения переменных TimeStart и TimeEnd, именно так они там записываются, а не "указаны часы начала и конца временного интервала"
01 ... 24
Например TimeStart - 09 , TimeEnd - 12
Это если только в часах, а если возможно сделать с минутами, то соответственно TimeStart - 09:00 , TimeEnd - 12:00
 
Без минут самый простой вариант, имхо, такой:
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
Без минут самый простой вариант, имхо, такой:
Спасибо большое! Выручил! Работает отлично.
Вот что значит сниппет, коротко и ёмко, а то я столько много экшеннов лепил - и регулярки и логику)
 
а с датами подскажите мне пожалуйста?
даты в формате dd.mm.yyyy

на входе три значения:
datestart > dateitem > datefinish
 
а с датами подскажите мне пожалуйста?
даты в формате 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
Последнее редактирование:
спасибо!
но, как не кручу - всегда "1"



и местами менял, и знаки менял
https://www.sendspace.com/file/64a1ev шаб

Проверил все работает, ответ 1 приходит если совпадений нет, если дата будет между указанными датами (не включая их) то снипет выйдет по ошибке, если надо наоборот то поменять местами ретурны надо.
Если надо чтобы даты старт и енд включались заменяем < и > на <= и >=
 
  • Оценить
Реакции: daymos
изменилось задание (
Надо дату "November 16, 2015" конвертировать в юникстайм и сравнить с другим юникстайм лежащем в переменной.
 
Код:
Развернуть Свернуть Копировать
Int32 unixTime = (Int32)(DateTime.Parse(project.Variables["datestart"].Value).Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
return unixTime;
работает, всем спасибо кто смотрел телевизор в то время когда я тут страдал:dy:
 
блин
а ведь можно било взять дату в юникс формате. и простим ява скриптом стравнивать.
Только теперь допер
 
Код:
Развернуть Свернуть Копировать
Int32 unixTime = (Int32)(DateTime.Parse(project.Variables["datestart"].Value).Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
return unixTime;
работает, всем спасибо кто смотрел телевизор в то время когда я тут страдал:dy:

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

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;
 
Ну так прочитай про метод, гугл же есть
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
Код:
Развернуть Свернуть Копировать
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
 
Последнее редактирование:
Код:
Развернуть Свернуть Копировать
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
Молодчик) Надеюсь сам сделал :)
 

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