在C#中处理时间的简单方法?

时间:2009-09-10 23:02:15

标签: c# .net datetime time date-math

我目前的方法类似于

DateTime startHour = new DateTime(1900,1,1,12,25,43);
DateTime endHour = new DateTime(1900,1,1,13,45,32);

// I need to, say, know if a complete DateTime instance 
// is later than startHour plus 15 minutes

DateTime now = DateTime.Now();

startHour = startHour.addMinutes(15);

if (now.CompareTo(new DateTime(now.Year, now.Month, now.Day, startHour.Hour, 
                    startHour.Minute, startHour.Second)) > 0) 
{
    //I can do something now
}

这非常麻烦,甚至容易出错。就我所见,TimeSpans不是解决方案,因为它们代表跨度并且不受24小时限制的约束(TimeSpan为56小时34分钟有效。)

此类计算的首选方法是什么?

我错过了什么?

编辑:我所追求的计算方法是将完整的DateTime实例与表示实际时间的小时,分​​钟,秒三元组以及操作这些三元组的方法(添加小时,分钟秒)进行比较。

编辑2:感谢大家,我认为,现在我得到了DateTime API的要点。 :)我唯一想念的是一种指定TimeSpan的方法,该TimeSpan应该仅代表TimeOfDay,但那是次要的。

4 个答案:

答案 0 :(得分:11)

你的意思并不完全清楚“大于startHour”......但是

TimeSpan startHour = new TimeSpan(12, 25, 43);
if (endHour.TimeOfDay > startHour)
{
    ...
}

......工作非常简单。

一定要添加参数检查,以确保没有为startHour指定值< 0或> 23小时,但这一切都非常简单。

与Joda Time相比,.NET的日期和时间API相当原始(即使在3.5) - 但在这种特殊情况下,我认为它并不太糟糕。

答案 1 :(得分:2)

一点提示 - .NET支持DateTime对象的算术运算,并返回TimeSpan对象。因此,您可以执行以下操作:

DateTime fromDate = ....
DateTime toDate = ....
TimeSpan diff = toDate - fromDate;

您可以将其扩展为:

DateTime fromDate = DateTime.Now;
DateTime toDate = DateTime.Now.addMinutes(x);

if ((toDate - fromDate).TotalMinutes > 15) {
    ...
}

答案 2 :(得分:0)

您应该将TimeSpan用于startHour和endHour。 与现在比较时,您应该将它们“转换”为完整的DateTime,或者如Jon Skeet所述,使用DateTime.TimeOfDay获取时间。


TimeSpan startHour = new TimeSpan(12, 25, 43);
DateTime now = DateTime.Now;

if (now.CompareTo(DateTime.Today.Add(startHour)) > 0) {
    //...
}


TimeSpan startHour = new TimeSpan(12, 25, 43);
DateTime now = DateTime.Now;

if (now.TimeOfDay.CompareTo(startHour) > 0) {
    //...
}

答案 3 :(得分:0)

所以你只对日期的时间部分感兴趣。

if(DateTime.Now.TimeOfDay > startHour.TimeOfDay)
{
  // do stuff
}

这样做有什么问题?