2012-10-18 22 views
4

最近,我在.NET中的時區感知Web應用程序中一直在討論時區。我提出了以下處理時區的解決方案。在.net中處理與時區有關的日期時間的最佳方法

我的解決辦法是:

  • 有用戶配置文件存儲他們在
  • 在Web服務器上的時區做所有的轉換和從UTC。
  • 將日期作爲UTC存儲在數據庫中。

我的問題是:

  1. 你們是否認爲這是在.net中的最佳方法?
  2. 正在使用UTC的datetime2足夠好,或者我應該將 偏移量中的客戶端時間存儲在數據庫中(基本上10-10-2012 4:00:00與10-10-2012 00:00:00 4: 00)?另外,你們中的一些人可能會注意到,雖然跨DST的跳轉是在服務器代碼中處理的,但將偏移量傳遞到SP或類似的DB上將無法正確處理DST。對此有何想法?

下面是時間轉換的示例代碼。

private TimeZoneInfo GetTimeZoneInfo() 
    { 
     var timeZone = TimeZoneDropdown.SelectedValue; 

     switch (timeZone) 
     { 
      case "Eastern": 
       return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
      case "Central": 
       return TimeZoneInfo.FindSystemTimeZoneById("Central Standard Time"); 
      case "Mountain": 
       return TimeZoneInfo.FindSystemTimeZoneById("Mountain Standard Time"); 
      case "Pacific": 
       return TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time"); 
      case "Alaskan": 
       return TimeZoneInfo.FindSystemTimeZoneById("Alaskan Standard Time"); 
     } 

     return TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    } 

    public DateTime ConvertLocalDateTimeToUtc(DateTime dateTime) 
    { 
     var timeZone = GetTimeZoneInfo(); 

     return TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified), timeZone); 
    } 

    public DateTime ConvertUtcToLocalDateTime(DateTime dateTime) 
    { 
     var timeZone = GetTimeZoneInfo(); 

     return TimeZoneInfo.ConvertTimeFromUtc(DateTime.SpecifyKind(dateTime, DateTimeKind.Utc), timeZone); 
    } 
+0

有一個缺點是在數據庫中將日期時間存儲爲UTC。你如何考慮數據庫方面的DST?根據時區和DST,無法將DateTime或DateTime2轉換爲用戶本地時間。如果你通過一個偏移量,那麼你可能仍然會因爲有一天在DST中而另一個不在。示例3/10/2012 2:00:00美國東部標準時間是2012年3月9日20:00:00,但2012年3月13日2:00:00美國東部標準時間是2012年3月12日19:00:00。基本上分別是-4和-5的偏移量。那麼你傳遞給你的SP -4或-5將UTC轉換爲本地的偏移量?無論哪種方式是錯的。 – aBetterGamer

+0

我認爲你需要提供更多關於時間如何使用的信息。如果是時間戳,那麼數據庫的本地時間戳格式(幾乎肯定)就是答案(可能是UTC)。如果只是向用戶顯示他們上次登錄的時間,那麼本地時間字符串可能是合適的。 – MZB

回答

1

您當前的做法是不,但你可以通過跟蹤偏移做得更好。

當你談論偏移時,你似乎認爲它們與時區有關。但是要意識到大多數時區有兩個不同的偏移量,一個用於標準時間,另一個用於白天時間。兩者的Microsoft時區ID在字符串中仍具有「標準」,因此這可能是混淆的一部分。但是您正在使用的TimeZoneInfo確實跟蹤標準和日光偏移量。

您需要將偏移量與每個單獨的日期和時間相關聯。你可以使用.Net中的DateTimeOffset類和SQL Server中的datetimeoffset數據類型。

如果您持續使用這些參數,則需要翻譯UTC和UTC。

相關問題