我们需要2个日期的夜间公式。这应该是一个布尔函数,它接收2个日期(它们之间的时差不超过12小时)并检查夜间时间,夜间时间设置为00:00至6:00 am, 该函数导致以下情况:
1/1/18 20:00- 2/1/18 7:00 true
2/1/18 1:00- 2/1/18 7:00 true
2/1/18 1:00- 2/1/18 5:15 true
1/1/18 20:00- 1/1/18 23:00 false
1/1/18 20:00- 2/1/18 3:30 true
我的工作(并非在所有情况下都有效)
private bool CheckNightHours(DateTime start, DateTime end)
{
var nightStart = new DateTime(start.Year, start.Month, start.Day ,0 ,0, 0);// 00:00;
var nightEnd = new DateTime(end.Year, end.Month, end.Day, 6, 0, 0); // 6:00;
bool result = false;
if (end < nightStart)
return false;
else {
if (start > nightStart && end > nightStart)
result = false;
else
if ((end >= nightEnd) || (end > nightStart && end < nightEnd))
result = true;
else
return result;
}
}
答案 0 :(得分:2)
DateTime firstTime = new DateTime(2018, 1, 1, 20, 0, 0);
DateTime secondTime = new DateTime(2018, 1, 2, 7, 0, 0);
DateTime midNight = new DateTime(firstTime.Year, firstTime.Month, firstTime.Day, 12, 0, 0).AddHours(12);
DateTime AM6 = midNight.AddHours(6);
if(firstTime < midNight)
{
if(midNight < secondTime)
return true;
return false;
}
else
{
if (secondTime < AM6)
return true;
return false;
}
答案 1 :(得分:2)
也许这会起作用
public static bool IsNight(DateTime from, DateTime to)
=> (to > from) && (from < from.Date.AddHours(6) || to < to.Date.AddHours(6) || to > from.Date.AddDays(1));
更新
或更完善,如@ZoharPeled
所建议public static bool IsNight(DateTime from, DateTime to)
=> (to > from) && ( rom.Hour < 6 || to.Hour < 6 || to > from.Date.AddDays(1));
前提是
to
大于from
(健全性检查)from
少于早上6点(所有其他to
都是有效的夜晚)to
少于早上6点,(其他所有fro
上午都是有效的夜晚)to
到from
的第二天,必须整晚我想您可以再添加24小时的健全性检查
注意 :仅当宣布夜间从午夜开始时才有效。
答案 2 :(得分:1)
TheGeneral发布了一个很好的答案,但是它只能在夜间从午夜开始工作。
一个更通用的解决方案是为夜间创建另一个DateTime范围并检查是否有重叠-因此您在正确的轨道上的哪个位置从开始时间和结束时间创建DateTime
值,并检查日期范围是否重叠-但用于测试范围是否重叠的代码是错误的。
从overlap标签Wiki:
查找元素是否重叠的方法是测试一个元素是否在第二个元素结束之前开始,而第二个元素在第一个元素结束之前开始。
因此,更好的代码是这样:
private bool CheckNightHours(DateTime start, DateTime end)
{
var nightStart = start.Date.AddDay();
var nightEnd = end.Date.AddHours(6);
bool result = false;
return nightStart < end && start < nightEnd;
}
我还简化了用于创建nightStart
和nightEnd
值作为奖励的代码。
答案 3 :(得分:0)
这种选择并不像以前那样优雅,但是我在计算时间(例如数学值)方面有不好的经验。时间格式更改可能会导致常见的过滤器错误。由您决定,您更喜欢什么。
/// <summary>
///
/// </summary>
/// <param name="startTime">First Datetime</param>
/// <param name="span">12 hours in your case</param>
/// <returns></returns>
public bool AnyNightHoursIncluded(DateTime startTime, int span)
{
int startHour = Convert.ToInt32(startTime.ToString("HH")); //24 hour format
for (int i = 0; i < span; i++)
{
int actualHourValue = Convert.ToInt32(startTime.AddHours(i).ToString("HH"));
//from 0:00 to 6:00
if (actualHourValue >= 0 && actualHourValue < 6)
return true;
}
return false;
}