6

将完整实例与代表一天中的实际时间DateTime的小时、分钟和秒进行比较的首选方法是什么,以及对这些三元组进行操作的能力(例如小时、分钟、秒......)?add


我目前的方法是

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 小时限制的约束(TimeSpan56 小时 34 分钟的 a 有效。)

这种计算的首选方法是什么?

4

4 回答 4

11

完全不清楚你所说的“大于 startHour”是什么意思......但是采取

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

...工作起来很简单。

无论如何添加参数检查以确保您没有为 startHour 指定<0 或>23 小时的值,但这一切都很容易。

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

于 2009-09-10T23:08:31.777 回答
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) {
    ...
}
于 2009-09-10T23:39:49.787 回答
1

您应该将 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) {
    //...
}
于 2009-09-10T23:09:32.087 回答
0

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

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

这样做有什么问题?

于 2009-09-10T23:15:31.007 回答