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

Vin*_*oth 2 .net c#

我正在尝试计算项目的耗用时间.
例如,
开始时间是06-Nov-2011 01:59:58 AM
结束时间是06-Nov-2011
01:00:00 AM 实际经过时间是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);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 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());
    }        
}
Run Code Online (Sandbox Code Playgroud)

然而,在一个理想的世界中,你不必解析模糊的当地时间,并猜测它们是否意味着更早或更晚.这里的背景是什么?

如果在所有可能的,改变你的数据源来记录的本地日期/时间UTC日期/时间,而不是...最好是在一个更解析友好的格式,如YYYY-MM-DDTHH:MM:SS