在C#中计算经过时间时的夏令时问题

时间:2012-02-16 09:20:14

标签: c# .net

我正在尝试计算项目的耗用时间 例如,
开始时间是06-Nov-2011 01:59:58 A.M
结束时间是06年11月6日01:00:00 A.M
实际经过时间为00:00:02
但是经历时间是-00:59:58(由于夏令时,时钟回到1小时)
如何在夏令时期间以正确的经过时间更好地计算出来?

代码:

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);

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用协调世界时来存储时间戳。每当您比较协调世界时的两个时间戳时,您就会得到正确的差异。

在C#中,您可以使用DateTime dt = DateTime.UtcNow获得该格式的当前时间戳。

另见http://en.wikipedia.org/wiki/Coordinated_Universal_Time