2012-11-07 41 views
1

我每天在給定時鐘時間運行一個進程(在美國 - 這很重要)。我一直在試圖計算如何在25小時內正確地做到這一點。考慮以下C#代碼:我如何檢測夏令時25小時日期

var referenceDate = new DateTime(2012, 11, 3); 
var referenceTime = new TimeSpan(0, 19, 30, 0); 
var originalTime = referenceDate.Add(referenceTime); 
var tomorrow = referenceDate.AddDays(1); 
var nextTimestamp = string.Format(
      "{0} {1:00}:{2:00}", 
      tomorrow.ToShortDateString(), 
      referenceTime.Hours, 
      referenceTime.Minutes); 
var nextRunTimestamp = DateTime.Parse(nextTimestamp); 

我使用格式/解析序列來確保我們可以避免跨越DST過渡時間的時間跨度。現在應該是以下表達式的結果?

nextRunTimestamp.Subtract(originalTime).TotalHours 

哦,原來是24,但我認爲它應該是25,因爲2012年11月4日是一個25小時的一天(上午2點轉換)等11月3日19:30之間的區別11月4日19:30應該是25個小時。

如何在一年中的每個日期找到正確答案?

+1

你可以使用UST呢?它沒有DLST,因此「univsersal」。 – Hardrada

+0

必須有一個直接的方法來安排一個任務的時間。可以設置備份碎片整理一段時間。計時器似乎並不是正確的工具。如果你的服務失敗了怎麼辦? – Paparazzi

+0

你可以很容易地使它與原來的方法一起工作,你只需要一個常量引用:'var hours = nextRunTimestamp.ToUniversalTime()。Subtract(originalTime.ToUniversalTime())。Tota lHours;'That's 25. –

回答

2

其實聽起來好像你根本不需要那樣做。你的問題似乎並不實際,因爲如果你每天都有同時運行的東西,它會自動適應你的時間變化。

如果你真的有興趣,雖然,你可以利用得到某一年的DaylightTime

var dst = TimeZone.CurrentTimeZone.GetDaylightChanges(2012); 

的DaylightTime對象有DST爲任何時區開始日期和時間以及結束日期和時間。從那裏開始,如果您非常喜歡,可以檢查DST開始或結束是否在您的時間段內下降,並根據需要添加或減去一小時。

然後在你的代碼,你可以有邏輯,如(僞代碼):

if(dst.End > originalTime && dst.End < tomorrow) 
    //Add hour for "25 hour" day 

if(dst.Start > orginalTime && dst.Start < tomorrow) 
    //Subtract hour for "23 hour" day 

編輯:我想我誤解你在做什麼。儘管如果您的DST開始或結束在您的時間段內,上述代碼可以提供給您。您正在尋找這樣的:

//Probably DateTime.Now, but whatever 
var referenceDate = new DateTime(2012, 11, 3, 19, 30, 0); 
var nextTime = referenceDate.AddDays(1); 

Timer t = new Timer(nextTime.ToUniversalTime() - referenceDate.ToUniversalTime()); 

t.Start(); 

我希望你是不是puting您的日期時間的字符串格式,然後試圖做一個解析的實際代碼...

+0

問題並非沒有實際意義,因爲它在星期天影響了我們。我們使用Timer對象(線程變種)在Windows服務中每天啓動一些處理。線程對象需要時間跨度,因此如果時間跨度爲24小時,則在DST轉換期間它不是恆定的。 – Tevya

+0

模擬。值得商榷的。爲爭論提出一些事情。爲什麼您不使用Windows調度程序來啓動您的過程,而不是讓服務等待一次中斷? – iMortalitySX

+0

使用TimeZone.CurrentTimeZone.GetDaylightChanges()可以做到這一點。它比我想要的有點混亂,但它的工作原理沒有任何格式/解析愚蠢。 – Tevya