我正在尝试计算项目的耗用时间
例如,
开始时间是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);
答案 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
获得该格式的当前时间戳。