如何处理偏移的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

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

(我自己从来没有用过)