C # Сравнение времени между двумя временными интервалами

Попытка сравнить данное время между двумя разами, чтобы увидеть, находится ли оно в этих интервалах. например если задано время 00:00, мне нужно выяснить, падает ли оно с 21:00:00 до 7:00:00. Пробовал TimeSpan.Compare без блокировки, а также используется & gt; или & lt; для части времени.

например Данные интервалы:

7:00:00 to 19:00:00
19:00:00 to 21:00:00
21:00:00 to 7:00:00

Время для сравнения:

00:00:00 and 01:00:00

Любая помощь будет оценена.

Updated Question:

Похоже, требование тихо расплывчато. Требование состоит в том, чтобы передать время (TimeSpan) и сравнить его с двумя интервалами TimeSpan, чтобы увидеть, попадают ли они в эти интервалы.

например Допустим, сотрудники получают разные надбавки, если работают на разных временных интервалах ниже:

Date Range: 2012-01-01 to 2012-31

19:00:00 to 21:00:00 ($10.00)
21:00:00 to 7:00:00 ($11.00)
7:00:00 to 19:00:00 ($12.00)

Чтобы рассчитать почасовую ставку для сотрудника, мне нужно проверить, работал ли сотрудник

Between Date Range :2012-01-01 to 2012-31 Between Time Range above.

И примените $ Rate соответственно.

 Jeppe Stig Nielsen17 мая 2012 г., 08:48
Вам нужно написать структуру временного интервала? Как структура, содержащая две временные точки, а именно время начала и время окончания.

Ответы на вопрос(6)

string dt=DateTime.Now.ToShortTimeString();
DateTime presenttime=Convert.ToDateTime(dt);

starttime = starttimepicker.ValueString;
DateTime dtime=Convert.ToDateTime(starttime);

if (dtime > presenttime)
{
   MessageBox.Show("Time cannot be greater than System Time. Please Try Again!", "Do not selecting future time", MessageBoxButton.OK);
            starttimepicker.Value = presenttime;
}
 27 нояб. 2013 г., 07:16
упс !! проблема в заголовке, см. весь код ниже после двух тегов, см. приянкский шах

Не уверен, почему таймспэн не работает для вас.

Я попробовал этот образец в моем приложении POC, и это сработало.

 DateTime t1 = DateTime.Now;
    DateTime t2 = DateTime.UtcNow;
    t1.TimeOfDay.CompareTo(t2.TimeOfDay);

Попробуйте, надеюсь, это решит проблему.

 Nil Pun17 мая 2012 г., 12:35
Это не решает проблему.

Следующий код ...

static class DateTimeExt {

    public static bool TimeOfDayIsBetween(this DateTime t, DateTime start, DateTime end) {

        var time_of_day = t.TimeOfDay;
        var start_time_of_day = start.TimeOfDay;
        var end_time_of_day = end.TimeOfDay;

        if (start_time_of_day <= end_time_of_day)
            return start_time_of_day <= time_of_day && time_of_day <= end_time_of_day;

        return start_time_of_day <= time_of_day || time_of_day <= end_time_of_day;

    }

}

class Program {

    static void Test(DateTime t, DateTime start, DateTime end) {
        bool falls_within = t.TimeOfDayIsBetween(start, end);
        Console.WriteLine("{0} \t[{1},\t{2}]:\t{3}", t, start, end, falls_within);
    }

    static void Main(string[] args) {

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0));
        Test(new DateTime(2012, 1, 1, 1, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0));

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0));
        Test(new DateTime(2012, 1, 1, 1, 0, 0), new DateTime(2012, 1, 1, 19, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0));

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0));
        Test(new DateTime(2012, 1, 1, 1, 0, 0), new DateTime(2012, 1, 1, 21, 0, 0), new DateTime(2012, 1, 1, 7, 0, 0));

        Test(new DateTime(2012, 05, 17, 00, 00, 00, 00), new DateTime(2012, 05, 17, 20, 00, 00), new DateTime(2012, 05, 18, 08, 00, 00));
        Test(new DateTime(2012, 05, 17, 09, 00, 00, 00), new DateTime(2012, 05, 17, 20, 00, 00), new DateTime(2012, 05, 18, 08, 00, 00));

        Test(new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 0, 0, 0), new DateTime(2012, 1, 1, 0, 0, 0));

    }

}

... печатает следующий результат:

1/1/2012 12:00:00 AM    [1/1/2012 7:00:00 AM,   1/1/2012 7:00:00 PM]:   False
1/1/2012 1:00:00 AM     [1/1/2012 7:00:00 AM,   1/1/2012 7:00:00 PM]:   False
1/1/2012 12:00:00 AM    [1/1/2012 7:00:00 PM,   1/1/2012 9:00:00 PM]:   False
1/1/2012 1:00:00 AM     [1/1/2012 7:00:00 PM,   1/1/2012 9:00:00 PM]:   False
1/1/2012 12:00:00 AM    [1/1/2012 9:00:00 PM,   1/1/2012 7:00:00 AM]:   True
1/1/2012 1:00:00 AM     [1/1/2012 9:00:00 PM,   1/1/2012 7:00:00 AM]:   True
5/17/2012 12:00:00 AM   [5/17/2012 8:00:00 PM,  5/18/2012 8:00:00 AM]:  True
5/17/2012 9:00:00 AM    [5/17/2012 8:00:00 PM,  5/18/2012 8:00:00 AM]:  False
1/1/2012 12:00:00 AM    [1/1/2012 12:00:00 AM,  1/1/2012 12:00:00 AM]:  True
 17 мая 2012 г., 15:32
@nilpun Как это терпит неудачу? Возвращаетсяtrue как это должно. Полночь между 8 вечера и 8 утра.
 17 мая 2012 г., 15:39
@nilpun Я не вижу, какDateTime это проблема. То, что вы передаете как год, месяц и день, будет просто проигнорировано. Это достаточно легко конвертировать изTimeSpan а также, если это ваш вклад.
 Nil Pun17 мая 2012 г., 15:07
Этот тест не пройден: Test (новый DateTime (2012, 05, 17, 09, 00, 00, 00), новый DateTime (2012, 05, 17, 20, 00, 00), новый DateTime (2012, 05, 18, 08 00, 00));
 17 мая 2012 г., 23:43
Это выглядит очень похоже на то, что я уже опубликовал, и я не вижу проблемы ни с одним ...
 Nil Pun17 мая 2012 г., 14:58
Благодаря @ branko-dimitrijevic, мы не сможем использовать параметры начала DateTime, конца DateTime. Я могу использовать только TimeSpan, поскольку предоставляется только временной интервал без даты.
Решение Вопроса

Вы можете написать себе метод расширения, как;

public static class TimeExtensions
{
    public static bool IsBetween(this DateTime time, DateTime startTime, DateTime endTime)
    {
        if (time.TimeOfDay == startTime.TimeOfDay) return true;
        if (time.TimeOfDay == endTime.TimeOfDay) return true;

        if (startTime.TimeOfDay <= endTime.TimeOfDay)
            return (time.TimeOfDay >= startTime.TimeOfDay && time.TimeOfDay <= endTime.TimeOfDay);
        else
            return !(time.TimeOfDay >= endTime.TimeOfDay && time.TimeOfDay <= startTime.TimeOfDay);
    }
}
 Nil Pun17 мая 2012 г., 09:06
Нет, это не возвращает правильный результат. Этот код должен возвращать истину, но он возвращает ложь: DateTime StartDate = new DateTime (2012, 05, 17, 20, 00, 00); DateTime EndDate = new DateTime (2012, 05, 18, 08, 00, 00); DateTime actualStartDate = new DateTime (2012, 05, 17, 00, 00,00,00); var result = actualStartDate.IsBetween (StartDate, EndDate);
 Nil Pun17 мая 2012 г., 08:53
Не могу использовать DateTime, может использовать только часть времени.
 17 мая 2012 г., 08:55
C # не имеет типа для «временной части», поэтому я только что использовал структуру DateTime. Часть Date не используется в методе расширения. Если вы используете какой-либо другой тип для описания времени, просто замените DateTime на «aT; MyTimeType». и измените сравнения, чтобы соответствовать.
 17 мая 2012 г., 10:22
Правильно, я вижу, тогда вам просто нужны некоторые дополнительные условия в методе, чтобы изменить сравнение, когда EndTime & lt; Начальное время.
 Nil Pun17 мая 2012 г., 13:16
Спасибо @RJ Лохан, к сожалению, все еще возвращает ложь.
var time1 = DateTime.Now.TimeOfDay;
var time2 = DateTime.Now.AddDays(1.3).TimeOfDay;
var diff = time2 - time1;

Так что это только для примера, чтобы показать, что добавление 1,3 дня все еще дает тот же самый ответ времени.

 17 мая 2012 г., 08:52
Нет, это не ... Console.WriteLine (DateTime.Now.TimeOfDay); Console.WriteLine (DateTime.Now.AddDays (1.3) .TimeOfDay); Печать; 16: 51: 54.9517864 00: 03: 55.5668215

Или, если ваши потребности выходят за рамки этого, используйте один из моихизбранное библиотеки.

 Nil Pun17 мая 2012 г., 13:56
спасибо, но библиотека, похоже, не имеет какой-либо функции, которая находит, если данное время попадает в диапазон времени. Дайте мне знать, если я пропал ...
 22 мая 2012 г., 10:39
Ты можешь использоватьITimePeriod.HasInside или жеITimePeriod.GetRelation определить, попадает ли время во временной диапазон.

Ваш ответ на вопрос