2014-12-02 123 views
2

假設我住在時區的今天日期是:12/3/2014 保存記錄之前我用UTC保存日期,因此它將是12/2/2014根據當地時間從數據庫中檢索記錄

user.Created = DateTime.UtcNow; 

現在我有,我想基於過濾器「今日」上檢索記錄搜索頁面。我也想截斷時間,所以我使用EF的DbFunction。

DateTime dateDifference = DateTime.Now.Date; 
var result= queryableData 
     .Where(s => dateDifference == 
     DbFunctions.CreateDateTime(s.Created.Year, s.Created.Month, 
      s.Created.Day, 0, 0, 0)).AsQueryable(); 

上面的查詢不返回任何記錄,因爲保存的日期是在UTC其中2014年12月2日,但我生活在一個時區,其中的日期是2014年12月3日。所以它是有道理的,我如何修改上述查詢來滿足我的要求。任何建議

+0

什麼是數據庫的類型?日期或日期時間? – 2014-12-02 14:09:22

+0

數據類型爲DateTime,記錄值保存爲UTC 12/2/2014 1:41 PM。 – 2014-12-02 14:10:51

+0

如果定義「本地今天」作爲午夜+ 24小時日期範圍,那麼你可以「今天UTC」翻譯「本地今天」進入和使用,作爲搜索條件。 – 2014-12-02 14:14:29

回答

3

現在我們知道該值(在UTC),你只需要在今天開始尋找午夜UTC時間,午夜的UTC時間今天結束存儲爲DateTime

如果你樂於使用系統時區,你可以使用:

DateTime today = DateTime.Today; 
DateTime startUtc = today.ToUniversalTime(); 
DateTime endUtc = today.AddDays(1).ToUniversalTime(); 

var result = queryableDate.Where(s => startUtc <= s.Created && 
             s.Created < endUtc); 

我不認爲你應該需要DbFunctions該查詢。基本上,你不需要差異在所有 - 你只需要找出什麼你的「今天」過濾器在時間間隔方面表示,表示爲UTC。

+0

它很好用。非常感謝。但我仍然困惑它是如何工作的。請您詳細說明一下 – 2014-12-02 14:22:35

+0

@AmmarKhan爵士:當我不明白您的理解時,很難說清楚。例如,如果你在美國西海岸,那麼「今日」(12月2日)的運行時間爲2014-12-02T08:00:00Z至2014-12-03T08:00:00Z,這就是你想要的希望查詢中的過濾器能夠完成。 – 2014-12-02 14:26:58

0

將您的本地日期爲通用時間。

DateTime universalDate = dateDifference.ToUniversalTime();