如何查找时间范围和日期范围的重叠小时数



我有一个11:00 PM5:00 AM的时间范围。(夜间营业时间)

我有日期范围,例如, 2014-04-01 00:00:002014-04-02 23:59:59

现在我需要计算给定日期范围内存在多少个夜间小时数。

对于上面的示例,它应该返回 11 小时 59 分 59 秒

解释:

2014-04-01 00:00 AM2014-04-01 5:00 AM = 5 小时

2014-04-01 11:00 PM2014-04-02 5:00 AM = 6 小时

2014-04-02 11:00 PM2014-04-02 11:59:59 PM = 0 小时 59 分 59 秒

一秒钟的近似是可以的。

如果这些是字符串,则需要使用DateTime.ParseExact方法解析它们以DateTime,然后使用运算符-它们进行差分。这让你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,只需使用-运算符并使用TimeSpan结构的.Hours.Minutes.Seconds性质。

有一个名为计算营业时间的项目,它是计算两个日期时间之间的营业时间。您可以基于此项目实施自己的夜班时间。

可以使用 .NET 的时间段库的 CalendarPeriodCollector

// ----------------------------------------------------------------------
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

相关内容

  • 没有找到相关文章

最新更新