如何比较日期时间的时间部分

54

假设我们有:

DateTime t1 = DateTime.Parse("2012/12/12 15:00:00.000");

DateTime t2 = DateTime.Parse("2012/12/12 15:03:00.000");

如何在C#中比较时间并判断哪个时间是“晚于”另一个时间?


2
你的问题与你的问题标题不符。你想比较DateTime还是仅比较DateTime的时间部分? - Jonathan Wood
4个回答

109
你可以使用TimeOfDay属性,并使用Compare对其进行比较。
TimeSpan.Compare(t1.TimeOfDay, t2.TimeOfDay)

根据文档:
-1  if  t1 is shorter than t2.
0   if  t1 is equal to t2.
1   if  t1 is longer than t2.

1
@Peretz,无意冒犯,但是这个答案应该告诉你所有需要知道的东西,不需要代码示例... - Jon
@Peretz 我已经更新了我的答案,并附上了代码片段及如何使用结果的说明。 - Justin Pihony
1
对于那位匿名的踩我答案的人,能否请您解释一下为什么我的这个回答以及其他10个回答都被踩了呢?顺带一提,系统会自动修复串行踩的问题,所以所有的回答都会被恢复……这真的值得吗? - Justin Pihony

37

<<=>>=== 运算符都可以直接用于 DateTimeTimeSpan 对象。因此,以下示例代码是可行的:

DateTime t1 = DateTime.Parse("2012/12/12 15:00:00.000");
DateTime t2 = DateTime.Parse("2012/12/12 15:03:00.000");

if(t1.TimeOfDay > t2.TimeOfDay) {
    //something
}
else {
    //something else
}

谢谢,我猜...像DateTime vs. TimeSpan这样的问题是否值得在第一时间就被投反对票呢?我认为不是。 - kaveman
它没有按照问题所述回答,因此通常这就是downvotes的用途。另外,您忘记提到==也可以使用。 - Justin Pihony
我们在这里真的在重复老生常谈,但你显然陷入了这些愚蠢的细节中(还和@mgnoonan一起)。在OP提交后,我的原始答案,你的答案,我的编辑答案等之间有一些编辑。在对问题的每个解释都不符合您自己的想法时,行使明智的判断力再进行投票。 - kaveman
如何比较日期时间的时间部分,以及“时间是‘晚于’”都涉及到时间。我目前只是在回应评论/问题。/耸肩 - Justin Pihony

6

使用DateTime.Compare方法:

DateTime date1 = new DateTime(2009, 8, 1, 0, 0, 0);
DateTime date2 = new DateTime(2009, 8, 1, 12, 0, 0);
int result = DateTime.Compare(date1, date2);
string relationship;

if (result < 0)
   relationship = "is earlier than";
else if (result == 0)
   relationship = "is the same time as";         
else
   relationship = "is later than";

Console.WriteLine("{0} {1} {2}", date1, relationship, date2);

编辑:如果你只是想比较时间而忽略日期,你可以使用其他人建议的TimeOfDay。如果你需要更粗略的内容,你也可以使用HourMinute属性。


2
是的,但是OP只是要求时间比较。如果您比较整个tick,那么它将无法测试例如6AM是否晚于5AM,这似乎是问题所暗示的。 - Justin Pihony
1
这是一个日期时间对象!将它们进行比较可以自动告诉你哪个更大! - mgnoonan
1
是的,但是1月2日上午5点比1月1日上午6点更大,但是5点不比6点更大。这就是比较完整的DateTime与仅其时间部分之间的区别。 - Justin Pihony
OP只是说“which is later”,我理解为是凭经验得出的。他可以自由选择任何符合他目的的答案。 - mgnoonan
仅从标题来看,你可能是对的,他特别想要时间部分。我可能读得太快了。嗯,好吧,我的答案还是成立的。 - mgnoonan
显示剩余2条评论

4

看这些例子,它们解释了在C#中的时区转换。

var startTime = new System.TimeSpan(23,0,0);
var endTime = new System.TimeSpan(02,0,0);

var startDateTime = new DateTime(DateTime.UtcNow.Date.Year, DateTime.UtcNow.Date.Month, DateTime.UtcNow.Date.Day, startTime.Hours, startTime.Minutes, startTime.Seconds);
var endDateTime = new DateTime(DateTime.UtcNow.Date.Year, DateTime.UtcNow.Date.Month, DateTime.UtcNow.Date.Day, endTime.Hours, endTime.Minutes, endTime.Seconds);

var cetTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Central European Standard Time");
var startConvertedTime = TimeZoneInfo.ConvertTimeFromUtc(startDateTime, cetTimeZone);
var endConvertedTime = TimeZoneInfo.ConvertTimeFromUtc(endDateTime, cetTimeZone);

Console.WriteLine(startConvertedTime.TimeOfDay);
Console.WriteLine(endConvertedTime.TimeOfDay);

var currentTime = new TimeSpan(03,0,0);
Console.WriteLine(currentTime);

Console.WriteLine(currentTime >= startConvertedTime.TimeOfDay && currentTime <= endConvertedTime.TimeOfDay);

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