在 C# 中,TimeOfDay(通常是 DateTime 的属性,返回 TimeSpan 类型)和 TimeOnly 类型都用于表示时间,它们的比较可以通过以下方式实现:

1. 类型转换后比较
由于 TimeOfDay 本质是 TimeSpan,而 TimeOnly 是独立的时间类型,直接比较需要先统一类型:
方法1:将 TimeOnly 转换为 TimeSpan 后比较
TimeOnly 提供了 ToTimeSpan() 方法,可转换为 TimeSpan,与 TimeOfDay(TimeSpan)直接比较:
ini
DateTime dateTime = DateTime.Now;
TimeSpan timeOfDay = dateTime.TimeOfDay; // 例如:14:30:00(TimeSpan)
TimeOnly timeOnly = new TimeOnly(15, 0, 0); // 15:00:00
// 转换后比较
bool isGreater = timeOfDay > timeOnly.ToTimeSpan();
// 结果:true(14:30 < 15:00,所以这里实际是 false,根据具体值判断)
方法2:将 TimeSpan 转换为 TimeOnly 后比较
通过 TimeOnly.FromTimeSpan() 方法将 TimeSpan 转换为 TimeOnly,再比较:
ini
DateTime dateTime = DateTime.Now;
TimeSpan timeOfDay = dateTime.TimeOfDay;
TimeOnly timeOnly = new TimeOnly(15, 0, 0);
// 转换后比较
TimeOnly timeFromSpan = TimeOnly.FromTimeSpan(timeOfDay);
bool isLess = timeFromSpan < timeOnly;
// 结果:true(如果 timeOfDay 是 14:30,则 14:30 < 15:00)
2. 直接比较时间分量
如果需要更细粒度的比较(如小时、分钟),可以分别获取两者的时间分量(时、分、秒)进行比较:
ini
DateTime dateTime = DateTime.Now;
int hourOfDay = dateTime.Hour;
int minuteOfDay = dateTime.Minute;
TimeOnly timeOnly = new TimeOnly(15, 0, 0);
// 比较小时
if (hourOfDay > timeOnly.Hour)
{
// 逻辑...
}
// 小时相等时比较分钟
elseif (hourOfDay == timeOnly.Hour && minuteOfDay > timeOnly.Minute)
{
// 逻辑...
}
总结
-
推荐通过 类型转换 统一为
TimeSpan或TimeOnly后使用比较运算符(>,<,==等),简洁且不易出错。 -
TimeOnly是 .NET 6+ 引入的专门表示时间的类型,相比
TimeSpan更语义化,建议优先使用TimeOnly.FromTimeSpan()将TimeOfDay转换为TimeOnly后比较。
本文使用 文章同步助手 同步