我有一个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 秒
一秒钟的近似是可以的。
如果这些是字符串,则需要使用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