簡體   English   中英

在C#中計算經過時間時的夏時制問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM