这是一种提供分钟级精度并支持夜间时间范围的方法,以 Oleg Rudckivsky 接受的答案为基础。
/// <summary>
/// Counts the number of minutes between <paramref name="from"/> and <paramref name="to"/>
/// that fall between <paramref name="rangeStart"/> and <paramref name="rangeEnd"/>.
/// </summary>
/// <returns>The total minutes spanned between the given range.</returns>
public static int GetMinutesInRange(DateTime from, DateTime to, TimeSpan rangeStart, TimeSpan rangeEnd) {
int minutes = 0;
bool overnight = rangeStart > rangeEnd;
for (var m = from; m < to; m = m.AddMinutes(1)) {
if (overnight) {
if (rangeStart <= m.TimeOfDay || m.TimeOfDay < rangeEnd) {
minutes++;
}
} else {
if (rangeStart <= m.TimeOfDay) {
if (m.TimeOfDay < rangeEnd) {
minutes++;
} else {
break;
}
}
}
}
return minutes;
}
示例用法:
DateTime from = new DateTime(1990, 1, 1, 6, 30, 0); // 7:30 AM
DateTime to = new DateTime(1990, 1, 1, 13, 30, 0); // 1:30 PM
TimeSpan rangeStart = new TimeSpan(9, 0, 0); // 9 AM
TimeSpan rangeEnd = new TimeSpan(17, 0, 0); // 5 PM
// Results in 270 (4.5 hours)
int minutes = GlobalHelpers.GetMinutesInRange(from, to, rangeStart, rangeEnd);