2014-04-04 28 views
1

在我的項目中,我想獲得世界時區。我使用了兩種不同的方法,但我不知道哪一種是最佳做法。獲取世界時區的正確方法

第一種方法是

public static DateTime GetUniversalTime(DateTime localDateTime) 
{ 
    TimeZone zone = TimeZone.CurrentTimeZone; 
    DateTime universal = zone.ToUniversalTime(localDateTime); 
    return universal; 
} 

那麼我想恢復到本地時間我用下面的方法:

public static DateTime GetLocalTime(DateTime universalDateTime) 
{ 
    TimeZone zone = TimeZone.CurrentTimeZone; 
    DateTime local = zone.ToLocalTime(universalDateTime); 
    return local; 
} 

和第二種方法是讓世界時區DateTime.UtcNow; 然後我要恢復到當地時間我用上面的GetLocalTime方法。

能解釋上述兩種方法有何不同?

哪一個是最佳做法?

+0

我不知道,但我想可能有不同的方式做同樣的事情。所以這些可能是同等的解決方案,只是一個是捷徑。 –

+0

@OleksandrPshenychnyy謝謝...有任何獲得當地時間的捷徑嗎? – Niventh

+0

是不是DateTime.Now本地相當於DateTime.UtcNow? –

回答

2

既然你問的最佳做法:

  • 使用TimeZone課。如果您需要時區轉換,請改用TimeZoneInfo類。這是the MSDN documentation非常明確:

    MSDN

  • 只要有可能,應避免任何使用的 「本地」 的時間。代碼運行的系統是本地的。在絕大多數實際使用情況下,很可能是您的用戶的本地時區爲而非。在Web應用程序中尤其如此。

    這意味着你不應該被任何調用以下

    • DateTime.Now
    • TimeZone.CurrentTimeZone
    • TimeZoneInfo.Local
    • DateTime.ToLocalTime()
    • DateTime.ToUniversalTime()
    • 任何OTH呃涉及服務器本地時區的方法。

  • 相反,你的應用程序應該允許用戶選擇一個時區,那麼你可以使用TimeZoneInfo.Convert...方法轉換,並從當地時間在該區域

  • 如果您需要當前的通用時間,請使用DateTime.UtcNowDateTimeOffset.UtcNow

  • 如果您需要服務器當前的本地時區,請僅使用DateTimeOffset.Now

  • 如果你需要在一個已知的時區當前的本地時間,如美國東部時間:

    DateTime easternNow = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(
                DateTime.UtcNow, "Eastern Standard Time"); 
    
  • 如果你想一個已知的時區和UTC之間進行轉換,然後使用TimeZoneInfo.ConvertTimeToUtcTimeZoneInfo.ConvertTimeFromUtc方法,並確保在您從轉換到/時區經過:

    // get the local time zone of your user, not of the server! 
    TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); 
    
    // use this to convert from UTC to local 
    DateTime local = TimeZoneInfo.ConvertTimeFromUtc(yourUtcDateTime, tzi); 
    
    // use this to convert from local to UTC 
    DateTime utc = TimeZoneInfo.ConvertTimeToUtc(yourLocalDateTime, tzi); 
    

    要知道,當你從本地轉換爲UTC,你可能會在白天遇到的含糊之處節省時間transitio納秒。閱讀更多在the DST tag wiki

補充閱讀:The Case Against DateTime.Now

-3

世界時。

DateTime.Now.ToUniversalTime() 

對於當地時間

DateTime.UtcNow.ToLocalTime() 

萬能本地

var nowUtc = DateTime.Now.ToUniversalTime(); 
var nowLocal = nowUtc.ToLocalTime(); 
+1

問題不在於此。這是他自己的解決方案 –

+0

我不想要新的方法。上述方法工作正常,但我想知道什麼是TimeZone和DateTime.UtcNow之間的區別; – Niventh

+0

兩者都一樣。因爲時區區分本地和通用。當你的LocalTime是UTC +3時。 TouniversalTime延長將從本地減去3小時。如果您將通用時間作爲參數發送給GetUniversalTime函數,IT將返回與參數相同的結果。 Becase DataTime對象存儲TimezoneInfo。 ToLocalTime的相同邏輯。 – halit

相關問題