2011-12-18 40 views
1

什麼是最好的方式代表阿賈克斯日期格式,當服務器和用戶有不同的格式,JavaScript和MVC 3。如何同步它的一切?日期格式阿賈克斯

+0

我認爲,最好的意見是在服務器端的DateTime使用ISO 8601 – 2011-12-18 09:12:59

+0

一件事內容一定要小心的是,如果你回到datetime.minvalue和你的時區從減去。這可能會導致膿毒。我建議考慮日期輸出的同時考慮。我想象會發生datetime.max +時區。 – Dessus 2011-12-18 21:46:02

回答

3

當您將日期信息作爲對AJAX請求的響應發送給客戶端時,請確保將其序列化爲JSON,因爲這是在服務器和客戶端之間交換消息的商定格式,並且在JavaScript中運行良好。不幸的是,JSON並沒有爲格式化日期提供任何規則。

在.NET中可以使用JavaScriptSerializer類對象序列化到JSON。如果你決定使用它,它會爲你處理序列化的DateTime結構。它將在MSDN上詳細描述,請參閱:Stand-Alone JSON Serialization

當不使用ASP.NET,一個DateTime類型在JSON表示爲 字符串特殊格式...

什麼它歸結爲是這樣的:「\ /日期( 700000 + 0500)\ /」

DateTime值顯示爲的 形式JSON字符串 「/日期(700000 + 0500)/」,其中第一個數字(700000中所提供的示例 )是數GMT時區中的毫秒數,常規爲 (非夏令)自午夜,1970年1月1日,時間的 數量可以是負向表示較早的時間。的一部分 由「0500」中的例子是可選的,表明該 時間是本地種 - 即應轉換爲對反序列化本地 時區。如果不存在,則時間爲 反序列化爲Utc。

注意,正斜槓都逃了出來。只有在這種情況下,字符串才能被解釋爲日期。如果不是,它應該只是被解釋爲一個字符串,但一個比較奇怪的一個...

那麼,我們如何「反序列化」這在JavaScript?如果沒有時區成分,它可以是簡單的:

var date = new Date(parseInt(value.substr(6))); 
// parseInt will pick up the integer value 
// The Date constructor understands the value as milliseconds from 1/1/1970 

或者您可以使用eval(考慮了一些「邪惡」),並注入一些JavaScript到值:

var date = eval("new " + value.slice(1, -1)); 
// effectively eval("new Date(1234567)") 

有許多關於這個StackOverflow上的問題,以及:

最後,來自微軟的伯特蘭樂華一個很好的博客文章,其解釋了.NET的理由:

Dates and JSON

所以我的建議是堅持與格式。NET將默認使用,並且始終能夠找到正確的方式來處理它,即使您還必須處理時區。不管你做什麼,都不會發明你自己的格式!

PS。從ASP.NET MVC 3中,您也可以將綁定建模爲JSON,因此您也可以將JSON發送到控制器操作。