c# - 在 C# 中计算耗时时出现夏令时问题

标签 c# .net

我正在尝试计算我的项目的运行时间。
例如,
开始时间是 06-Nov-2011 01:59:58 A.M
结束时间为 06-Nov-2011 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 点拨回。

如果您知道要将开始时间视为较早 选项,而将结束时间作为较晚 选项,则可以使用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

关于c# - 在 C# 中计算耗时时出现夏令时问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9308476/

相关文章:

c# - 如何从 appsettings.json 加载设置字典?

Array.SetValue 在运行时的 C# 类型转换

c# - Entity Framework - 同一实体的不同代理对象。并包括具有多条路径到同一目的地的行为

c# - 将 C# 代码转换为 F#(if 语句)

c# - 如何使 + 运算符在将两个点相加时起作用?

c# - 并发访问 .NET 中的静态成员

.net - 如何使用 SemanticComparison 比较两个匿名类型或两个不同类型的集合

c# - 线程安全的有限大小队列

c# - WPF 用户控件的加载事件多次触发

c# - IEnumerable<type> 不包含 'Contains' 的定义