2012-04-23 17 views
1

我有一個windows服務,每天凌晨3點到凌晨5點運行。當作業運行時會發生以下情況:上一天使用DateTime導致UTC格式的問題

var endDate = DateTime.Today.ToUniversalTime(); // Set to midnight 
var startDate = endDate.AddDays(-1); 

運行在夜間查詢說像(所有時間目前存儲爲UTC):

SELECT * FROM Table WHERE CreatedAt BETWEEN startDate AND endDate 

這一切正常,它基本上抓住一切作業運行前一天的數據。我現在正在開發一個用戶界面部分,用戶點擊一個按鈕查看將在夜間處理的數據計數。

我遇到的問題是當用戶在正常工作時間內工作並點擊該按鈕時,計數將被關閉1天。如果當地時間晚於美國東部時間晚上8點(服務器位於東海岸),則計數將只能正確顯示,因爲UTC時間是午夜之後。

我試過的東西,如來解決這個問題:

var now = DateTime.Now; 
var midnight = DateTime.Today.ToUniversalTime(); 

var endDate = (now.Day == midnight.Day) ? midnight.AddDays(1) : midnight; 
var startDate = endDate.AddDays(-1); 

但是,這是不正確的,它會在一天中的某些部分才能正常工作。如果在當地時間午夜之後點擊該按鈕,則該按鈕將再次關閉一天。

有沒有什麼聰明的方法來使用DateTime對象來解決這個問題?

回答

0

您可以在您的用戶界面中將本地時間翻譯爲UTC;或者只是使用DateTime.UtcNow。你必須要小心ToUniversalTime,因爲它只能如果DateTime你叫上有Kind==DateTimeKind.Local

var localTimeUtc = TimeZoneInfo.ConvertTimeToUtc(
    DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Local)); 

//or (much easier) 
var localTimeUtc = DateTime.UtcNow; 

然後:

var utcMidnight = localTimeUtc.Date; 
var yesterdayUtcMidnight = midnight.AddDays(-1); 

現在utcMidnightyesterdayUtcMidnight將覆蓋所有「昨天」的UTC時間。

第二個說明 - 您的Windows服務是否意味着處理昨天UTC或昨天本地的數據?如果數據庫中的時間是UTC,那麼您的服務代碼應該可以工作 - 但是如果他們已經進入本地時間(可能默認爲GetDate()?),那麼您的代碼處理將不起作用。