2012-05-10 56 views
2

我一直在谷歌搜索一段時間,試圖找到某種解決方案,但有一點運氣。LINQ中的時區轉換

我試圖得到一組對應於一天數據量的記錄。一天的數據是4:00:00EST-3:59:59EST。當我向用戶顯示我的結果集時,我希望結果顯示在用戶的當地時間(在我的情況下是CST)。這通常不會很難,除了:

  • 我的數據庫中的時間戳都在GMT。
  • 數據庫的本地時間在EST。
  • 我的當地時間是科技委。

由於數據庫的時間在EST,但記錄保存在格林威治標準時間,我不能簡單地調用GETDATE()並調整它。

值得注意的是,我在C#和數據庫中使用的是LINQ/Entity Framework 4.1 Code-First,它是Sybase。

那麼,根據上面的信息,將數據從GMT轉換爲用戶本地時間的方法是什麼?

+3

你是指UTC?我很確定GMT有DST。 –

+0

@AustinSalonen謝謝,編輯。 – Kittoes0124

回答

4

事實證明,我已經過度了這一點,解決方案其實很簡單。以下鏈接都非常有幫助:

http://iamacamera.org/default.aspx?section=develop/code%20snippets&id=76 http://msdn.microsoft.com/en-us/library/ms973825.aspx

之前詢問我設置下面的變量數據庫:

DateTime utcBeginDateTime = DateTime.UtcNow.Date.AddHours(8); 
DateTime utcEndDateTime = utcBeginDateTime.AddDays(1); 

這給了我UTC時間2012/5/10 8 :00:00 AM至5/11/2012 8:00:00 AM。這個轉換到EST是相當簡單:

TimeZoneInfo estZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
DateTime cstTime = TimeZoneInfo.ConvertTimeFromUtc(utcBeginDateTime, estZone); 

這會給我EST時間2012/5/10上午04時零零分00秒


在我的LINQ查詢使用此:

var timeQuery = from p in db.cl_contact_event 
       where p.time_of_contact >= utcBeginDateTime && p.time_of_contact < utcEndDateTime 
       select new 
       { 
        time = TimeZoneInfo.ConvertTimeFromUtc(p.time_of_contact.Value, estZone), 
        id = p.id 
       }; 

它,除非你使用.AsEnumerable在客戶端上運行查詢TimeZoneInfo.ConvertTimeFromUtc()將可能無法正常工作沒有價值()。我知道它絕對不適用於我們的Sybase版本。因此,我不得不盡可能地過濾結果,調用.AsEnumerable(),然後執行時區轉換/其他邏輯。

+0

我有一個類似的問題,這種類型的解決方案爲我工作。謝謝。 – ozziwald

+0

好的解決方案。要小心'AsEnumerable'意味着你正在客戶端做這件事。 UTC轉換變得棘手,如果你想在'where或'order by'中使用它。 – nawfal