2013-06-04 54 views
1

考慮到我有一個客戶端和服務器,以及一類這樣的:C#JavaScriptSerializer和DateTime.MinValue穿越時區

客戶端:(時區:UTC -8)

class Foo { 
     public int a; 
     public DateTime MyTime { get; set; } 
    } 

var serialized = new JavaScriptSerializer().Serialize(new Foo { a = 1 }); 
// Send serialized to server 

服務器端(時區UTC-4)

// Receive JSON 
var deserialized = new JavaScriptSerializer().Deserialize<Foo>(serialized); 
if (deserialized.MyTime == DateTime.MinValue) { 
    // dostuff 
} 

我在這裏的問題是,JavaScriptSerializer.Serialize(foo),確實MyTime.MinValue.ToUniversalTime()這給了我1月0001 08:00:00。接下來,當我在服務器端反序列化時,它會在DateTime.MinValue上看到8小時,if測試失敗。我也不能做到本地時間,因爲服務器和客戶端不在同一個時區,所以localtime會給我1. january 0001 04:00:00

在本月底我要提問:

  1. 什麼是處理這個因爲 JavaScriptSerializer()負責呼叫.ToUniversalTime()的最佳途徑。我的 目前的做法是隻檢查大約0年的時間範圍。
  2. 鑑於我們有DateTime.MinValue,應該不要指望這個值總是正好如此。 DateTime.MinValue.ToUniversalTime()不應該等於DateTime.MinValue?基本上我問是否應該有一個明確的,如果在所有轉換例程中尋找DateTime.MinValue

謝謝。

JavaScriptSerializer: http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.aspx
日期時間: http://msdn.microsoft.com/en-us/library/system.datetime.aspx

+1

此外,對於這樣的問題的性能和解決方案,建議使用Newtonsoft.Json而不是JavascriptSerializer。 – Alxandr

+0

你使用'DateTime.MinValue'作爲'null'的替代嗎?如果是,爲什麼不使用'public DateTime? MyTime「並將它設置爲null而不是用MinValue打擾? –

回答

0

只是通過他們周圍的字符串,而不是DateTime是否。 yyyy-MM-dd hh:mm:ssZ將使其處於文化中立狀態並將其轉換爲UTC,這會忽略所有時區。這用於代碼u的C#DateTime中。

+0

感謝krillgar,如果我總是控制客戶端應用程序,這是個好主意。問題是我希望能夠讓其他人與服務器集成,因此我不能認爲他們會堅持這一點。 – tajen

+0

這確實需要成爲更普遍的做法。我記得第一次遇到DateTime轉換的問題只是在C#代碼中。我通過Web服務使用手持式Windows CE設備。在設備,服務和數據庫之間,因爲代碼的每個部分都假設我部分轉換爲UTC時間,所以我最終關閉了大約11個小時。這是一場噩夢。 – krillgar

0

使用DateTimeOffset而不是DateTime。它看起來像串行序列化結構如下:

{"a":1,"MyTime":"\/Date(-62135596800000)\/"} 

這意味着該字符串可以通過在服務器端一個DateTimeDateTimeOffset領域反序列化。它看起來像這些將上面的字符串反序列化爲午夜,所以我假設反序列化器將該數字解釋爲+00:00偏移量,因爲它離開電線。