比较时间跨度对象,如果它在 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
}
我想过滤一组对象。目标是过滤两个时间跨度对象之间的对象:
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
}