2013-04-05 28 views
1

我有一個始終保持午夜時間的日期時間列表,以及當天網站被視爲「啓動」的秒數。獲取一天中的秒數

我需要計算「正常運行時間」的百分比,所以我需要確切知道當天有多少秒鐘。我想知道是否有類似於DateTime.DaysInMonth(年,月)的.NET中的任何內容,但在一天中的秒數。

我的Google-fu似乎讓我失望,而我所能找到的只有.NET constant for number of seconds in a day? - 但這並沒有考慮夏令時。

我認爲這是作爲

var secondsInDay = (startDay.AddDays(1) - startDay).TotalSeconds; 

一樣簡單,但我在想,如果這是正確的(簡單,但並不詳盡的測試表明它是)?
有沒有更有效的方法來計算給定日期的秒數?

請注意 - 這需要考慮到的夏令時間

+0

我認爲你過於複雜的事情。爲什麼不KISS,只是基於UTC天? – Joe 2013-04-05 21:04:30

+0

這是用於監控託管網站的網站統計信息。我們需要能夠承諾99。9%的正常運行時間 – berkeleybross 2013-04-05 21:08:10

回答

0

這裏是一個功能,會做你問:

public int SecondsInDay(DateTime dateTime, string timeZoneId) 
{ 
    var dt1 = dateTime.Date; 
    var dt2 = dt1.AddDays(1); 
    var zone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); 

    var dto1 = new DateTimeOffset(dt1, zone.GetUtcOffset(dt1)); 
    var dto2 = new DateTimeOffset(dt2, zone.GetUtcOffset(dt2)); 
    var seconds = (dto2 - dto1).TotalSeconds; 

    return (int) seconds; 
} 

舉個例子:

int s = SecondsInDay(new DateTime(2013, 1, 1), "Central Standard Time"); 
// 86400 

int s = SecondsInDay(new DateTime(2013, 3, 10), "Central Standard Time"); 
// 82800 

int s = SecondsInDay(new DateTime(2013, 11, 3), "Central Standard Time"); 
// 90000 
+0

非常感謝,完美的作品! – berkeleybross 2013-04-05 22:39:08

0

如何:

TimeSpan.FromDays(1).TotalSeconds

當然,除非你想佔秒添加和刪除偶爾從一天起保持地球歲差與時鐘一致

對於日光跟蹤,你可以檢查你的日子是否是兩個之一再通過

TimeZone.CurrentTimeZone.GetDaylightChanges(2013)

返回,並添加/刪除三角洲

或者您也可以根據過去的24小時,而不是第1天

+0

我必須承認,我沒有嘗試過。它是否考慮到夏令時?我沒有嘗試過,因爲我沒有看到它如何知道夏令時開始/停止的時間(即有些天有23小時,有些有25天) – berkeleybross 2013-04-05 21:01:10

1

我認爲你需要時刻計算您的正常運行跳過這些把戲使用DateTimeOffsetTimeZoneInfo。這article可以幫助你,特別是第比較和算術運算與DateTimeOffset值第二個代碼段。

您可以在該代碼中看到他們在夏令時期爲DateTimeOffset實例添加了小時,並且結果考慮了時間變化。

編輯:下面的代碼從上述文章所(代碼沒有做你想做的,但表明,隨着TimeZoneInfo使用DateTimeOffset正在考慮夏令時:

public static void Main() 
    { 
     DateTime generalTime = new DateTime(2008, 3, 9, 1, 30, 0); 
     const string tzName = "Central Standard Time"; 
     TimeSpan twoAndAHalfHours = new TimeSpan(2, 30, 0); 

     // Instantiate DateTimeOffset value to have correct CST offset 
     try 
     { 
     DateTimeOffset centralTime1 = new DateTimeOffset(generalTime, 
        TimeZoneInfo.FindSystemTimeZoneById(tzName).GetUtcOffset(generalTime)); 

     // Add two and a half hours  
     DateTimeOffset centralTime2 = centralTime1.Add(twoAndAHalfHours); 
     // Display result 
     Console.WriteLine("{0} + {1} hours = {2}", centralTime1, 
                twoAndAHalfHours.ToString(), 
                centralTime2); 
     } 
     catch (TimeZoneNotFoundException) 
     { 
     Console.WriteLine("Unable to retrieve Central Standard Time zone information."); 
     } 
    } 

    // The example displays the following output to the console: 
    // 3/9/2008 1:30:00 AM -06:00 + 02:30:00 hours = 3/9/2008 4:00:00 AM -06:00