C# 在C语言中计算运行时间时的夏令时问题#
我正在计算我的项目所用的时间。C# 在C语言中计算运行时间时的夏令时问题#,c#,.net,C#,.net,我正在计算我的项目所用的时间。 例如, 开始时间是2011年11月6日01:59:58上午 结束时间为2011年11月6日凌晨01:00:00 实际运行时间为00:00:02 但经过的时间是-00:59:58(由于夏时制,时钟向后退了1小时) 如何在夏令时使用正确的运行时间更好地计算此值 代码: DateTime startDttm = DateTime.Parse("Nov 06, 2011 01:59:58 AM"); DateTime endDttm = DateTime.Parse(
例如,
开始时间是2011年11月6日01:59:58上午
结束时间为2011年11月6日凌晨01:00:00
实际运行时间为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);
使用协调世界时来存储时间戳。无论何时比较协调世界时中的两个时间戳,都会得到正确的差值 在C语言中,您可以使用
DateTime dt=DateTime.UtcNow
获得该格式的当前时间戳
另请参见。您的值基本上是不明确的-这两个时间都发生了两次,假设时钟回到凌晨2点 如果您知道要将开始时间视为较早的选项,将结束时间视为较晚的选项,则可以使用: 然而,在一个理想的世界中,您不必解析含糊不清的本地时间,并猜测它们是早一点还是晚一点。这里的背景是什么
如果可能,请将数据源更改为记录UTC日期/时间,而不是本地日期/时间。。。理想情况下,使用更易于解析的格式,例如yyyy-MM-ddTHH:MM:ss首先将其转换为unix时间戳,然后计算它。检查Noda时间api。尝试将其转换为UTC,如startDttm.ToUniversalTime();结束。ToUniversalTime();然后尝试了Subtract(),也给出了相同的结果。在进行转换时,您需要考虑时区。@Vinoth:您的计算基本上是不明确的。例如,如果您的时间是01:30:00和01:45:00,则正确答案可能是15分钟或1小时15分钟。这就是使用本地日期/时间的问题。你一定要吗?乔恩,你不想要zone.AtLater(结束)?@IanHorwill:哦,是的:)现在经过的时间是按要求的。写这封信的时候我一定是半睡半醒了——抱歉!
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());
}
}