[英]Daylight saving issue while calculating Elapsed Time in 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);
您的值基本上是模棱兩可的-假設時鍾回到凌晨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#中,您可以通過使用DateTime dt = DateTime.UtcNow
獲得該格式的當前時間戳。
另請參見http://en.wikipedia.org/wiki/Coordinated_Universal_Time 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.