2012-01-31 3 views
0

У меня есть небольшая проблема при обработке DateTime на C#. Я разработал приложение Windows, которое взаимодействует с системой автоматизации Harris. Приложение получает все триггеры для программ EPG. Теперь у меня есть этот вопрос:Как сменная рукоятка DateTime

триггер получил DateTime: 2012-01-31 23:58:23

спускового точное время: 00:03:53 (это значение может быть либо> сейчас() или < сейчас()

Вот код, который обрабатывает это:

DateTime segmentStartDateTime = DateTime.Now.ToUniversalTime().Date; 
segmentStartDateTime = segmentStartDateTime + item.TIME; 

Если мы протестируем этот код с вышеописанным случаем, я получаю segmentStartDateTime = 2012-01-31 00:03:53, что является неправильным значением (правое значение должно быть 2012-02-01 00:03:53).

Уверен, что кто-то из вас столкнулся с этой проблемой раньше, и я буду признателен за любую помощь в ее устранении (чтобы определить, находится ли время в текущий день или на следующий день).


еще несколько примеров:

1)

Вход: - Текущее время: 2012-03-08 13:27:00 - Received TimeSpan в виде строки: 13:28:30

Выход - Программа начнется в: 2012-03-08 13:28:30

2)

Вход: - Текущее время: 2012-03-08 23:58:19 - Received TimeSpan в виде строки: 00:02:15

Выход - Программа начнется в: 2012-03-09 00:02:15 (день после)

3)

Вход: - Текущее время: 2012-03-08 23:58:19 - Получено TimeSpan в виде строки: 23:57:43

Выход - программа начнется в: Теперь уже пора (2012-03-08 23:57:43)

+0

Используйте 'DateTime.UtcNow' вместо' DateTime.Now.ToUniversalTime() '. Это быстрее и не имеет проблем при переходе с/на летнее время. – CodesInChaos

+0

Является ли проблема, что вы надеялись получить время 1 февраля, а не 31 января? –

+0

проблема в том, что я могу получить триггер до его реального начала datetime – user852194

ответ

0
DateTime NextTimeOfDayAfter(TimeSpan timeOfDay, DateTime start) 
{ 
    DateTime result = start.Date + timeOfDay; 
    if(result<start) 
    result=result.AddDays(1); 
    return result; 
} 

Не знаю, как это взаимодействует с DST. Но IMO DateTime не должны использоваться в любое время в любое время.


Просто испытано, и оба ваши примеры работают с моим кодом:

var now1=DateTime.Parse("2012-03-08 13:27:00"); 
var time1=TimeSpan.Parse("13:28:30"); 
NextTimeOfDayAfter(time1,now1).Dump();//08.03.2012 13:28:30 

var now2=DateTime.Parse("2012-03-08 23:58:19"); 
var time2=TimeSpan.Parse("0:02:15"); 
NextTimeOfDayAfter(time2,now2).Dump();//09.03.2012 00:02:15 

DateTime NextTimeOfDayAfter(TimeSpan timeOfDay, DateTime start, TimeSpan gracePeriod) 
{ 
    DateTime result = start.Date + timeOfDay; 
    if(result+gracePeriod<start) 
    result=result.AddDays(1); 
    return result; 
} 
+0

Я сделаю тест, и я дам вам обратную связь – user852194

+0

Привет CodeInChaos, но это работает, только если полученный промежуток времени больше текущего времени. попробуйте проверить этот случай: var now1 = DateTime.Parse ("2012-03-08 13:27:00"); var time1 = TimeSpan.Parse ("13:25:30"); – user852194

+0

Что вы ожидаете от этого тестового примера? Он вернет '2012-03-09 13: 27: 00', что является самым ранним моментом в будущем, который имеет это время суток. – CodesInChaos

Смежные вопросы