我在处理C#中的DateTime
时遇到了一个小问题。我设计了一个与Harris自动化系统交互的Windows应用程序。该应用程序接收EPG程序的所有触发器。现在我有这个问题:
触发收到
DateTime
:2012-01-31 23:58:23触发确切时间:
00:03:53
(此值可以是> now()或< now()
以下是处理此问题的代码:
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
- 收到的TimeSpan为字符串:13:28:30
输出 - 程序将从:2012-03-08 13:28:30
2)
输入: - 当前时间:2012-03-08 23:58:19
- 收到的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 :(得分:0)
您可以查看.NET 3.5中引入的DateTimeOffset结构:http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
(我自己从未使用过它)
答案 1 :(得分: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;
}