Простой способ справиться со временем в C #? - PullRequest
5 голосов
/ 11 сентября 2009

Мой нынешний подход похож на

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
}

Это очень громоздко и даже подвержено ошибкам. Насколько я могу видеть, временные интервалы не являются решением, поскольку они представляют пролеты и не ограничены 24-часовым пределом (допустимый временной интервал 56 часов 34 минуты.)

Каков предпочтительный подход для расчетов такого типа?

Что мне не хватает?

РЕДАКТИРОВАТЬ: вычисления, которые мне нужны, представляют собой способы сравнения полного экземпляра DateTime с часовым, минутным, вторым триплетом, представляющим фактическое время дня, и способ работы с этими триплетами (добавление часов, минут и секунд).

РЕДАКТИРОВАТЬ 2: Спасибо всем, я думаю, теперь я понял суть API DateTime. :) Единственное, что мне не хватает, - это способ указать TimeSpan, который должен представлять только TimeOfDay, но это не так.

Ответы [ 4 ]

11 голосов
/ 11 сентября 2009

Не совсем понятно, что вы подразумеваете под "больше, чем startHour" ... но принимая

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

... работает довольно просто.

Во что бы то ни стало добавьте проверку аргументов, чтобы убедиться, что вы не указали значение для startHour, которое составляет < 0 или > 23 часа, но это все довольно просто.

API даты и времени .NET довольно примитивен (даже в 3.5) по сравнению, скажем, с Joda Time - но в данном конкретном случае я думаю, что это не так уж и плохо.

2 голосов
/ 11 сентября 2009

Небольшая подсказка - .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) {
    ...
}
0 голосов
/ 11 сентября 2009

То есть вас интересует только компонент времени даты.

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

Что не так с этим делать?

0 голосов
/ 11 сентября 2009

Вы должны использовать TimeSpan для startHour и endHour. При сравнении с сегодняшним днем ​​вы должны «преобразовать» их в полный DateTime или получить Time с 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) {
    //...
}
...