比较时间跨度对象,如果它在 C# 中的几个小时之间

Comparing timespan object if it's between hours in C#

我想过滤一组对象。目标是过滤两个时间跨度对象之间的对象:

  TimeSpan tsFrom = TimeSpan.Parse("16:00");
  TimeSpan tsTo = TimeSpan.Parse("00:59");

例如我有这个对象:

TimeSpan dateObject = TimeSpan.Parse("22:05:22");

当我尝试比较 dateObject 是否在 tsFrom 和 tsTo 之间时出现问题:

if (dateObject > tsFrom && dateObject < tsTo)
{
// do something ....
}

这不适用于这种情况。您有什么想法可以让我完成这项工作吗?

您想使用一天中的时间。 TimeSpan 数据类型适用于时间跨度(说起来有点明显)。这些是 不同 个概念。

一天中的时间恰恰是激发创建新 TimeOnly type in .NET 6. It has an IsBetween 方法的原因:

Determines if a time falls within the range provided. Supports both "normal" ranges such as 10:00-12:00, and ranges that span midnight such as 23:00-01:00.

请注意,IsBetween 使用包含开始、排他结束的更明智的约定,这意味着您将使用 01:00 作为结束时刻,而不是意外排除,例如00:59:17 来自您的经期


对于旧版本,我建议您意识到如果 To 小于 From(例如,它代表一个跨越午夜的时间段),您应该检查:

if ((tsTo > tsFrom && dateObject >= tsFrom && dateObject < tsTo) ||
    (tsFrom > tsTo && (dateObject < tsTo || dateObject >= tsFrom)))
{

}

请再次注意,此逻辑假设包含 From 和排他性 To(您的原始逻辑将两端视为排他性,这很少是正确的)

这个问题是你试图以错误的方式使用 timeSpan 方法,如果我做对了,你是在尝试检查 dateObject 时间是否介于 tsFrom 和 tsTo 之间,问题是您正在尝试使用 tsTo 引用不同的一天,这是时间跨度无法处理的事情。 我使用 dateTime 修复它以至少指定时间从哪一天开始,我建议将代码更改为此

        string datevalue = @"15/03/2021 16:00:00";
        DateTime start = DateTime.Parse(datevalue);

        datevalue = @"16/03/2021 00:59:00";
        DateTime end = DateTime.Parse(datevalue);

        datevalue = @"15/03/2021 22:05:22";
        DateTime obj = DateTime.Parse(datevalue);

        if (obj > start && obj < end)
        {
            //Do something
        }