检查日期时间实例是否在另外两个日期时间对象之间。

73

我想知道在 C# 中如何检查给定的 datetime 实例是否在另外两个实例之间的简单算法。

注意:

我浏览了这篇文章How do I check if a given datetime object is "between" two datetimes?,但它是针对 Python 的,还有其他很多针对 PHP 的。大部分其他问题都是关于两者之间的差异。

详细信息:

我更加关注时间,日期对我来说无所谓。例如,我有一个 DataBase 条目,员工在上午 10:00 - 晚上 9:00 工作,我想知道在给定时间(例如 2:00 PM)哪个员工正在上课。现在这将向我返回正在此时间参与活动的员工的详细信息。

编辑

在接受答案后(已经超过一年),我意识到我错误地描述了问题。但所有我认为当时需要做的是日期和时间比较。因此,Jason 和 VikciaR 的答案都可以使用。


1
听起来你需要将比较作为数据库查询的一部分,而不是在 C# 中进行。 - Andrew Savinykh
1
@Zespri 更多细节来解释确切的情况。员工时间表记录了员工的上下班时间[这些是客户支持],这些人有像通过邮件联系、通过电话联系等通信方式的字段。当有人打电话反映问题时,我需要检查在那个特定时间[客户拨打公司客户支持的时间]该员工可用的通信方式是哪一种,明白吗? - Deeptechtons
1
你可以在数据库列中使用类型为 Time,并在 C# 中使用 TimeSpan 类。然后非常简单地选择所需的用户:选择 * from users where workStarts > @now and workEnds < @now; - VikciaR
5个回答

112

使用DateTime.Ticks可以计算时间。在DateTime上使用.Ticks将您的日期转换为长整数。然后只需使用简单的if语句来查看目标日期是否在其中。

// Assuming you know d2 > d1
if (targetDt.Ticks > d1.Ticks && targetDt.Ticks < d2.Ticks)
{
    // targetDt is in between d1 and d2
}  

7
正确吗?DateTime.Ticks是表示此实例的日期和时间的滴答数。该值介于DateTime.MinValue.Ticks和DateTime.MaxValue.Ticks之间。因此,您将比较完整的日期而不是时间。 - VikciaR
16
这是一种更加晦涩的方法得到错误答案 - 它是 targetDt < d1,只不过更难理解。 - Kirk Broadhurst
2
它将起作用,因为 DateTime 内部是一个简单的数字。当您解析它时,它会转换为该数字。每个 DateTime 实例都是具有不同值的该数字。但您也可以比较 DateTime,因为它实现了 IComparable 接口。只需在此答案中删除所有的 Ticks 即可。 - Bitterblue
1
这怎么被接受为正确答案的?按照这里建议的方式仍会考虑DateTime对象的日期组件,而这不是OP想要的。他们只想考虑时间组件,不包括日期。 “获取表示此实例的日期和时间的滴答数。”[MS文档] (https://learn.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=netcore-3.1) - Cícero Neves

64

进行简单的比较,使用 > 和 < 符号。

if (dateB < dateA && dateA < dateC)
    //do something

如果你只关心时间:

if (dateA.TimeOfDay>dateB.TimeOfDay && dateA.TimeOfDay<dateC.TimeOfDay)
    //do something

@Vikcian,这也考虑了日期。例如,dt1 = 1/1/2011 1:00:00Amdt2 = 1/1/2011 5:00:00 Pm,检查的时间为 10/2/2011 2:00:00 Am,即使时间在早上1点和下午5点之间,但由于日期不同,结果将返回false。 - Deeptechtons
1
来自MSDN:DateTime.TimeOfDay属性 - 表示自午夜以来经过的一天中分数的时间间隔。因此,当您比较两个日期的TimeOfDay时,您将获得所需的结果 - 哪个时间更早/更晚。 - VikciaR
2
只要没有夜班工人,它就能正常运作。但是如果B=晚上11点,C=凌晨5点……??问题不清楚是否会发生这种情况。 - Ian Mercer
你是对的,Hightechrider。但这只是细节 - 你可以用 if (B<C) 表达这个意思:不是夜班工人,否则就是夜班工人。 - VikciaR
1
@Vikcia由Jason提供了优雅的解决方案,没有太多的麻烦,并且给出了所有输入值的答案。但是感谢您为我提供了一个良好的起点。 - Deeptechtons
显示剩余2条评论

17

编写一个辅助函数:

public static bool IsBewteenTwoDates(this DateTime dt, DateTime start, DateTime end)
{
    return dt >= start && dt <= end;
}

然后调用: .IsBewteenTwoDates(DateTime.Today ,new DateTime(,,));


我猜应该是 dt > start 而不是 dt >= start。 - Valera Scherbakov

1

你可以使用:

if (date >= startDate && date<= EndDate) { return true; }

这与@VikciaR的答案相同。 - xiawi

0

您可以使用:

if ((DateTime.Compare(dateToCompare, dateIn) == 1) && (DateTime.Compare(dateToCompare, dateOut) == 1)
{
   //do code here
}

或者

if ((dateToCompare.CompareTo(dateIn) == 1) && (dateToCompare.CompareTo(dateOut) == 1))
{
   //do code here
}

这甚至不包括日期部分。我对日期部分最不关心。时间对我来说是最重要的。我强调这一点的原因是在注册时,公司的员工/客户支持人员只提供他空闲的时间段以便接待任何客户。但是日期是虚构的,只是因为数据库中的日期时间字段需要它。 - Deeptechtons

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接