2012-02-16 77 views
2

我正在嘗試計算我項目的經過時間。
例如,
開始時間是06 - 11月2011年上午01點59分58秒
結束時間是06 - 11月2011年上午1時00分零零秒
實際用掉的時間是0點00分02秒
但獲取已用時間爲-00:59:58(由於夏令時,時鐘返回1小時)
如何在夏令時期間以更好的方式計算出正確的使用時間?用C計算經過時間的夏令時問題#

代碼:

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

首先將其轉換爲unix時間戳然後計算它。 – 2012-02-16 09:23:18

+0

檢查野田時間api。 http://noda-time.blogspot.in/ – 2012-02-16 09:23:52

+0

嘗試將其轉換爲UTC,如startDttm.ToUniversalTime(); end.ToUniversalTime();然後嘗試減法(),也給出了相同的結果。 – Vinoth 2012-02-16 09:29:42

回答

0

使用協調世界時來存儲您的時間戳。無論何時您比較協調世界時的兩個時間戳,您都會得到正確的區別。

在C#中,您可以使用DateTime dt = DateTime.UtcNow獲取該格式的當前時間戳。請參閱http://en.wikipedia.org/wiki/Coordinated_Universal_Time

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

+0

喬恩,你不想zone.AtLater(結束)? – 2012-02-16 10:24:38

+0

@IanHorwill:哎呀,是的:)現在所用的時間是按要求的。寫這個答案時,我一定是半睡半醒 - 道歉! – 2012-02-16 10:48:01