2009-12-31 15 views
1

什麼是存儲/檢索由具有特定本地日期和時間的應用程序創建的日期時間值的最佳方式,該日期時間值存儲在可能位於服務器中的數據庫中一個不同的時區,然後由不同時區的其他設備檢索到,這些設備需要使用與最初輸入相同的本地時間解釋日期時間值?例如,PST時區中的用戶創建應該在上午8:00的1/1/10發生的事件;該事件的日期時間存儲在服務器上;那麼EST時區中的用戶檢索DateTime,並且將事件解釋爲在上午8:00發生在1/1/10,而不是上午11:00。如何通過不同的時區移動本地日期時間值

當前的實現會創建一個帶有本地時區的DateTime,但是當DateTime使用Windows Services上傳到服務器時,DateTime將被存儲在數據庫中之前轉換爲服務器的本地時區。

回答

1

將它們全部存儲爲通用時間,並轉換爲當地時區。你會發現ToUniversalTimeToLocalTime有幫助。 下面是從MSDN示例代碼:

 System.Console.WriteLine("Enter a date and time."); 

     string strDateTime = System.Console.ReadLine(); 

     System.DateTime localDateTime; 
     try { 
      localDateTime = System.DateTime.Parse(strDateTime); 
     } 
     catch (System.FormatException) { 
      System.Console.WriteLine("Invalid format."); 
      return; 
     } 

     System.DateTime univDateTime = localDateTime.ToUniversalTime(); 

     System.Console.WriteLine("{0} local time is {1} universal time.", 
           localDateTime, 
           univDateTime); 

     System.Console.WriteLine("Enter a date and time in universal time."); 
     strDateTime = System.Console.ReadLine(); 

     try { 
      univDateTime = System.DateTime.Parse(strDateTime); 
     } 
     catch (System.FormatException) { 
      System.Console.WriteLine("Invalid format."); 
      return; 
     } 

     localDateTime = univDateTime.ToLocalTime(); 

     System.Console.WriteLine("{0} universal time is {1} local time.", 
           univDateTime, 
           localDateTime); 
+1

'ToLocalTime'始終使用本機的當前時區 - 它不會讓您指定特定的時區,煩人。幸運的是,.NET 3.5通過'TimeZoneInfo'顯着改善了事情。 – 2009-12-31 18:46:17

+0

好點。它也只關注當前的DST調整規則,而不是過去的規則,所以對於過去的日期它可能會導致轉換錯誤。您建議的'TimeZoneInfo.ConvertTime'方法似乎沒有失敗。 – jball 2009-12-31 18:49:15

3

假設你真的知道涉及兩個時區,你可以使用TimeZoneInfo.ConvertTime。如果你不要總是知道涉及的兩個時區,當然,你塞滿......

存儲在其他地方建議的UTC時刻是一個好主意在許多情況下 - 它不起作用當你需要捕捉「每天下午3點」或類似的想法時。

+0

是的,「每天下午3點」是我正在處理的場景的類型。看起來我有兩種選擇:將日期/時間存儲爲UTC,並存儲客戶端的時區,以便其他時區中的客戶端可以適當地轉換UTC時間;僅存儲日期(該日期的午夜),然後存儲日期/時間應該表示爲db中單獨項目的午夜小時數/分鐘數。合理? – 2009-12-31 19:32:16

+0

@泰德:是的,絕對。當Noda Time(http://code.google.com/p/noda-time)完成時,這應該對你更容易一些:)如果你提供更多關於* exact *情況的細節,我可以建議進一步來說。 – 2009-12-31 20:11:52

相關問題