2012-02-16 78 views
2

我正在尝试计算我项目的经过时间。
例如,
开始时间是06 - 11月2011年上午01点59分58秒
结束时间是06 - 11月2011年上午1时00分零零秒
实际用掉的时间是0点00分02秒
但获取已用时间为-00:59:58(由于夏令时,时钟返回1小时)
如何在夏令时期间以更好的方式计算出正确的使用时间?用C计算经过时间的夏令时问题#

代码:

DateTime startDttm = DateTime.Parse("Nov 06, 2011 01:59:58 AM"); 
DateTime endDttm = DateTime.Parse("Nov 06, 2011 01:00:00 AM"); 
TimeSpan elapsedTime = endDttm.Subtract(startDttm); 
Console.WriteLine("Elapsed Time - " + elapsedTime); 
+0

首先将其转换为unix时间戳然后计算它。 – 2012-02-16 09:23:18

+0

检查野田时间api。 http://noda-time.blogspot.in/ – 2012-02-16 09:23:52

+0

尝试将其转换为UTC,如startDttm.ToUniversalTime(); end.ToUniversalTime();然后尝试减法(),也给出了相同的结果。 – Vinoth 2012-02-16 09:29:42

回答

0

使用协调世界时来存储您的时间戳。无论何时您比较协调世界时的两个时间戳,您都会得到正确的区别。

在C#中,您可以使用DateTime dt = DateTime.UtcNow获取该格式的当前时间戳。请参阅http://en.wikipedia.org/wiki/Coordinated_Universal_Time

6

你的数值基本上是不明确的 - 假设时钟在凌晨2点返回,那两次都发生了两次

如果你知道你要正确对待的开始时间为较早选项,结束时间为选项,你可以使用Noda Time

using System; 
using NodaTime; 
using NodaTime.Text; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     var pattern = LocalDateTimePattern.CreateWithInvariantInfo 
       ("MMM dd, yyyy HH:mm:ss tt"); 
     LocalDateTime start = pattern.Parse("Nov 06, 2011 01:59:58 AM").Value; 
     LocalDateTime end = pattern.Parse("Nov 06, 2011 01:00:00 AM").Value; 

     DateTimeZone zone = DateTimeZone.ForId("America/Chicago"); 

     // Where this is ambiguous, pick the earlier option 
     ZonedDateTime zonedStart = zone.AtEarlier(start); 

     // Where this is ambiguous, pick the later option 
     ZonedDateTime zonedEnd = zone.AtLater(end); 

     Duration duration = zonedEnd.ToInstant() - zonedStart.ToInstant(); 

     // Prints 00:00:02 
     Console.WriteLine(duration.ToTimeSpan()); 
    }   
} 

在一个理想的世界,然而,你不需要解析当地时间不明确的地方,并猜测他们是早点还是晚点。这里的背景是什么?

如果在所有都有可能,请更改您的数据源以记录UTC日期/时间而不是本地日期/时间......理想情况下采用更易于分析的格式。 yyyy-MM-ddTHH:mm:ss

+0

乔恩,你不想zone.AtLater(结束)? – 2012-02-16 10:24:38

+0

@IanHorwill:哎呀,是的:)现在所用的时间是按要求的。写这个答案时,我一定是半睡半醒 - 道歉! – 2012-02-16 10:48:01