Как найти перекрывающиеся часы диапазона времени и диапазона дат?

У меня есть диапазон времени 11:00 PM в 5:00 AM, (ночные часы)

У меня есть диапазон дат, например,2014-04-01 00:00:00 в 2014-04-02 23:59:59

Теперь мне нужно вычислить, сколько ночных часов присутствует в заданном диапазоне дат.

Для приведенного выше примера он должен возвращать 11 часов 59 минут 59 секунд

Объяснение:

2014-04-01 00:00 AM в 2014-04-01 5:00 AM = 5 часов

2014-04-01 11:00 PM в 2014-04-02 5:00 AM = 6 часов

2014-04-02 11:00 PM в 2014-04-02 11:59:59 PM = 0 час 59 минут 59 секунд

одно второе приближение хорошо.

2 ответа

Если это строки, вам нужно проанализировать их DateTime с DateTime.ParseExact метод, а затем получить разницу их с - оператор. Это дает вам TimeSpan, Я вижу, что ваши строки имеют разные форматы. Вам нужно разобрать их в согласованном формате один за другим.

После этого вы можете использовать TimeSpan свойства как;

string s = "2014-04-01 00:00 AM";
var date = DateTime.ParseExact(s,
                               "yyyy-MM-dd HH:mm tt",
                               CultureInfo.InvariantCulture);
string s1 = "2014-04-01 5:00 AM";
var date1 = DateTime.ParseExact(s1,
                                "yyyy-MM-dd H:mm tt",
                                CultureInfo.InvariantCulture);


TimeSpan ts = date1 - date;
Console.WriteLine(string.Format(@"{0} hours {1} minutes {2} seconds",
                                  ts.Hours, ts.Minutes, ts.Seconds));

Выход будет;

5 hours 0 minutes 0 seconds

Если они уже DateTime Просто используйте - оператор и использование .Hours, .Minutes а также .Seconds свойства TimeSpan состав.

Существует проект под названием " Расчет рабочих часов", который рассчитывает рабочие часы между двумя датами. Вы можете реализовать свои собственные часы ночной смены на основе этого проекта.

Вы можете использовать CalendarPeriodCollector библиотеки периодов времени для.NET:

// ----------------------------------------------------------------------
public void NightHours()
{
    CalendarPeriodCollectorFilter filter = new CalendarPeriodCollectorFilter();
    filter.CollectingHours.Add( new HourRange( 0, 5 ) ); // working hours
    filter.CollectingHours.Add( new HourRange( 23, 24 ) ); // working hours

    CalendarTimeRange testPeriod =
       new CalendarTimeRange( new DateTime( 2014, 4, 1 ), 
       new DateTime( 2014, 4, 3 ) );
    Console.WriteLine( "Calendar period collector of period: " + testPeriod );

    CalendarPeriodCollector collector =
                    new CalendarPeriodCollector( filter, testPeriod );
    collector.CollectHours();
    Console.WriteLine( "Duration: " + new DateDiff( collector.Periods.TotalDuration ) );
} // NightHours
Другие вопросы по тегам