如何处理偏移的DateTime
本文关键字:DateTime 处理 何处理 | 更新日期: 2023-09-27 18:21:55
我在C#中处理DateTime
时遇到了一个小问题。我设计了一个与哈里斯自动化系统交互的windows应用程序。该应用程序接收EPG节目的所有触发器。现在我有这个问题:
触发器收到
DateTime
:12012-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
-接收时间跨度为字符串:13:28:30
输出-程序将在以下位置启动:2012-03-08 13:28:30
2)
输入:-当前时间:2012-03-08 23:58:19
-接收时间跨度为字符串:00:02:15
输出-程序将在:2012-03-09 00:02:15
(第二天)开始
3)
输入:-当前时间:2012-03-08 23:58:19
-接收时间跨度为字符串:23:57:43
输出-程序将在以下位置启动:现在,已经到时间了(2012-03-08 23:57:43
)
DateTime NextTimeOfDayAfter(TimeSpan timeOfDay, DateTime start)
{
DateTime result = start.Date + timeOfDay;
if(result<start)
result=result.AddDays(1);
return result;
}
不确定这是如何与夏令时相互作用的。但是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;
}
您可以看看在.NET 3.5中引入的DateTimeOffset结构:http://msdn.microsoft.com/en-us/library/system.datetimeoffset.aspx
(我自己从来没有用过)