2009-09-10 2 views
4

Мой текущий подход является то, какПростой способ обработки времени в C#?

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 минуты.)

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

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

EDIT: Расчеты, которые я выполняю, - это способы сравнить полный экземпляр DateTime с часовым, минутным, вторым триплетами, представляющим фактическое время суток и способ работы над этими триплетами (добавить часы, минуты секунд).

EDIT 2: Спасибо всем, я думаю, теперь я получил суть API DateTime. :) Единственное, что я пропустил, - это средство указать TimeSpan, который должен представлять только TimeOfDay, но это незначительно.

+0

Какую проблему вы пытаетесь решить? Это просто, что TimeSpan может превышать 24 часа? Потому что вы можете легко проверить это. –

ответ

9

Это не совсем понятно, что вы подразумеваете под «больше StartHour» ... но с

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

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

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

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

+1

Это первый раз, когда я слышал, что кто-то ссылается на API даты/времени .NET как «примитивный» в отрицательном тоне, и я не мог больше не согласиться. :) –

+0

@ 280Z284: до 3.5 вы даже не могли использовать нелокальные часовые пояса! По сравнению с Joda, .NET действительно довольно примитивен. Нет типа, представляющего мгновение со связанным часовым поясом - только сдвиг UTC. Blech. Подумал бы портировать Джоду, если бы у меня было больше времени. –

+0

Да, скалы Джода.Особенно по сравнению с родным Java Datetime. –

0

Вы должны использовать TimeSpan для startHour и endHour. По сравнению с теперь вы должны «преобразовать» их в полный DateTime или получить время с DateTime.TimeOfDay, как упоминалось в Jon Skeet.


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) { 
    //... 
} 
+0

Зачем так, вместо того, чтобы принимать текущее время суток? И зачем использовать CompareTo вместо удобного перегруженного оператора «больше, чем»? –

+0

Я просто использую свой собственный код. –

0

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

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

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

+0

Он будет работать, но нет необходимости в части даты StartHour и endHour. –

+0

Да, но это так, если вы предполагаете, что предоставленный фрагмент является единственной частью кода, который использует startHour. Но что, если значение даты startHour используется в другом месте? –

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) { 
    ... 
} 
Смежные вопросы