基本上,我有一個Silverlight .net Web應用程序,用戶可以根據他的日程安排他的日程安排等等。所以他選擇一個時間和日期來運行任務,他可能在世界上的任何地方,然後這個時間日期被存儲在數據庫中,但是啓動並運行這個計劃任務的服務器將會在別的地方(比如說馬耳他等),所以時區將會不同。如果不詢問用戶的時區,將用戶時間轉換爲服務器時間,將服務器時間轉換爲用戶時間,反之亦然,以便處理任務,最佳方式是什麼?用戶時間和服務器時間不同的時區問題
在此先感謝,喬恩
基本上,我有一個Silverlight .net Web應用程序,用戶可以根據他的日程安排他的日程安排等等。所以他選擇一個時間和日期來運行任務,他可能在世界上的任何地方,然後這個時間日期被存儲在數據庫中,但是啓動並運行這個計劃任務的服務器將會在別的地方(比如說馬耳他等),所以時區將會不同。如果不詢問用戶的時區,將用戶時間轉換爲服務器時間,將服務器時間轉換爲用戶時間,反之亦然,以便處理任務,最佳方式是什麼?用戶時間和服務器時間不同的時區問題
在此先感謝,喬恩
我想你想存儲在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轉換到本地時間的一些很好的信息。
>請告訴我沒有要求的用戶的時區
你還去要承擔客戶端操作系統時區設置正確的最好的方式(這往往並非如此),並使用該時區轉換爲/從您的服務器時間這應該在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;
}
我不是專家,但我以前也遇到這種情況。我通過傳遞客戶端時區作爲請求的一部分來解決它。 – 2011-04-03 13:34:53