2011-04-03 66 views
2

基本上,我有一個Silverlight .net Web應用程序,用戶可以根據他的日程安排他的日程安排等等。所以他選擇一個時間和日期來運行任務,他可能在世界上的任何地方,然後這個時間日期被存儲在數據庫中,但是啓動並運行這個計劃任務的服務器將會在別的地方(比如說馬耳他等),所以時區將會不同。如果不詢問用戶的時區,將用戶時間轉換爲服務器時間,將服務器時間轉換爲用戶時間,反之亦然,以便處理任務,最佳方式是什麼?用戶時間和服務器時間不同的時區問題

在此先感謝,喬恩

+0

我不是專家,但我以前也遇到這種情況。我通過傳遞客戶端時區作爲請求的一部分來解決它。 – 2011-04-03 13:34:53

回答

2

我想你想存儲在UTC時間在服務器上的一切,然後將其轉換回了用戶的時間,當你走在客戶端應用程序,以顯示它。當用戶安排任務時,將該時間轉換爲客戶端的UTC時間並將其傳遞給服務器。然後服務器總是將UTC時間傳遞迴客戶端。

下面是一個快速代碼示例,從客戶端獲取UTC時間並將其轉換爲當地時間。

//Get UTC time 
var utcTime = DateTime.UtcNow; 
Console.WriteLine("{0} {1}", utcTime, utcTime.Kind); 

//Convert UTC time to local time 
var localTime = utcTime.ToLocalTime(); 
Console.WriteLine("{0} {1}", localTime, localTime.Kind); 

Kind屬性會告訴你,如果你正在處理本地或UTC時間。這個SO question也有關於從UTC轉換到本地時間的一些很好的信息。

0

>請告訴我沒有要求的用戶的時區

你還去要承擔客戶端操作系統時區設置正確的最好的方式(這往往並非如此),並使用該時區轉換爲/從您的服務器時間這應該在UTC

這裏有幾個擴展方法,可以讓你做到這一點。

發送給客戶端的任何日期都應該在客戶端UI上呈現之前調用ToDisplayTime()

同樣,在客戶端向服務器發送日期之前,應該調用FromDisplayTime()將其轉換爲UTC。 因此服務器UTC發送和接收時間只有

/// <summary> 
    /// Converts the specified DateTime (which should be the UTC time) into the users timezone. 
    /// </summary> 
    /// <param name="utcDateTime"></param> 
    /// <returns></returns> 
    public static DateTime ToDisplayTime(this DateTime utcDateTime) 
    { 
     var result = TimeZoneInfo.ConvertTime(utcDateTime, TimeZoneInfo.Local); 
     return result; 
    } 

    /// <summary> 
    /// Converts the specified DateTime from local time to UTC 
    /// </summary> 
    /// <param name="locatDateTime"></param> 
    /// <returns></returns> 
    public static DateTime FromDisplayTime(this DateTime locatDateTime) 
    { 
     var result = TimeZoneInfo.ConvertTime(locatDateTime, TimeZoneInfo.Local, TimeZoneInfo.FindSystemTimeZoneById("UTC")); 
     return result; 
    } 
+0

timezoneinfo類獲取用戶所在時區的一個問題?它是否需要用戶操作系統時區?謝謝 – jon 2011-04-03 17:43:39

+0

是的,但如上所述,這可能會導致問題,假設您的用戶坐在悉尼澳大利亞(+10 UTC),並且他們的操作系統上的時區爲-8,那麼如果您的用戶輸入時間,它將會不同於他們認爲他們將在18點前進入!在這種情況下,您將不得不向用戶確認他們的時區是否正確。 – wal 2011-04-03 23:22:16

相關問題