Как найти перекрывающиеся часы диапазона времени и диапазона дат?
У меня есть диапазон времени 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