C# 夜间检查功能c
我们需要一个包含两个日期的夜间公式。这应该是一个布尔函数,它接收2个日期,它们的时差不超过12小时,并检查夜间时间,夜间时间设置为00:00到6:00 am, 该功能会导致以下情况: 1/1/18 20:00-2/1/18 7:00真实 2018年2月1日1:00-2018年2月1日7:00真实 2018年2月1日1:00-2018年2月1日5:15对 1/1/18 20:00-1/1/18 23:00假 1/1/18 20:00-2/1/18 3:30真实 我的工作不适用于所有情况C# 夜间检查功能c,c#,algorithm,function,overlap,C#,Algorithm,Function,Overlap,我们需要一个包含两个日期的夜间公式。这应该是一个布尔函数,它接收2个日期,它们的时差不超过12小时,并检查夜间时间,夜间时间设置为00:00到6:00 am, 该功能会导致以下情况: 1/1/18 20:00-2/1/18 7:00真实 2018年2月1日1:00-2018年2月1日7:00真实 2018年2月1日1:00-2018年2月1日5:15对 1/1/18 20:00-1/1/18 23:00假 1/1/18 20:00-2/1/18 3:30真实 我的工作不适用于所有情况
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;
}
}
也许这会奏效
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));
更新
或者更好的建议
前提是,
to大于来自健全性检查的值
从早6点到晚6点是有效的
到现在还不到早上6点,所有其他的from将是一个有效的夜晚
从第二天到第二天,一定要过一个晚上
我想你可以再加上24小时的精神检查
注意:这只会在夜间被宣布为午夜开始时起作用,也许这会起作用
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));
更新
或者更好的建议
前提是,
to大于来自健全性检查的值
从早6点到晚6点是有效的
到现在还不到早上6点,所有其他的from将是一个有效的夜晚
从第二天到第二天,一定要过一个晚上
我想你可以再加上24小时的精神检查
注意:这只会在夜间被宣布为午夜开始后才起作用。这个替代方案不像以前那么优雅,但我在计算时间(比如数学值)时有不好的经验。时间格式更改可能导致常见的过滤器错误。由你决定,你喜欢什么
/// <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;
}
这个替代方案不像以前那么优雅,但我有过像计算数学值那样计算时间的糟糕经历。时间格式更改可能导致常见的过滤器错误。由你决定,你喜欢什么
/// <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;
}
发布了一个很好的答案,但是它只会在午夜开始工作。
一个更通用的解决方案是为夜间创建另一个DateTime范围并检查重叠-因此您可以在正确的轨道上从开始时间和结束时间创建DateTime值并检查日期范围是否重叠-但是用于测试范围重叠是否错误的代码
从标记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值的代码,作为奖励。给出了一个很好的答案,但它只能在午夜开始工作。
一个更通用的解决方案是为夜间创建另一个DateTime范围并检查重叠-因此您可以在正确的轨道上从开始时间和结束时间创建DateTime值并检查日期范围是否重叠-但是用于测试范围重叠是否错误的代码
从标记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值的代码,作为奖励。在开始时间中添加12小时,然后确保结束时间大于开始时间,结束时间小于开始时间加上12小时。因此,基本上,您想知道提供给函数的日期时间值范围是否等于时间值范围在00:00和06:00之间。欢迎来到stackoverflow。请花一分钟来回答问题,特别是如何回答,以及相应的问题。是的,我已经试过了,但我没有发现所有案件都得到解决的情况,@jdweng我不是要检查日期差是否大于12,我们假设日期差小于12小时将12小时添加到开始时间,然后确保结束时间大于开始时间,结束时间小于开始时间加上12小时。因此,基本上您想知道您提供给函数的日期时间值范围是否在00:00和06:00之间。欢迎使用堆栈溢出。请花一分钟来回答问题,特别是如何回答,以及相应的问题。是的,我已经试过了,但我没有发现所有案件都得到解决的情况,@jdweng我不是要检查日期差是否大于12,我们假设日期差小于12小时,甚至在之前就已经进行了投票:-但您可能还想添加一个项目符号,说明这仅适用于宣布夜间从午夜开始的情况。如果是在01:00开始,你会有误报,如果是在23:00开始,你会有误报。之前已经投票过:-但你可能还想添加一个项目符号,说明这只适用于宣布夜间从午夜开始的情况。如果在01:00开始,你会
如果在23:00开始,则会出现假阳性。第二种情况下的失败2/1/18 1:00-2/1/18 7:00第二种情况下的失败2/1/18 1:00-2/1/18 7:00:00@vhkvua是-Date属性基本上会截断DateTime之外的小时数,因此您可以得到该日期的午夜,您添加一天是因为希望午夜正好在开始日期之后。@vhkvua yes-date属性基本上会截断日期时间之外的小时数,这样您就可以得到该日期的午夜,您添加一天是因为希望午夜正好在开始日期之后。