我正在尝试计算项目的耗用时间.
例如,
开始时间是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)
你的价值观基本上是模棱两可的 - 假设时钟在凌晨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