這是我在測試MVC3時發現的(不是真的答案)。如果要在美國更改DST時序列化的DateTime是2007年以前,那麼在處理DST更改的洞中處理日期時間時,服務器上發生的任何日期序列化將爲1小時。 (http://en.wikipedia.org/wiki/DST_in_the_US)。基本上,它似乎在所有日期都使用最新的DST規則。
例子。
Server Time: Friday, March 12, 2004 10:15:00 AM
JSON Serialization: /Date(1079115300000)/
JS Time Formated: 10:15
Saturday, March 13, 2004 10:15:00 AM
JSON Serialization: /Date(1079201700000)/
JS Time Formated: 10:15
Sunday, March 14, 2004 10:15:00 AM
JSON Serialization: /Date(1079288100000)/
JS Time Formated: 11:15 (failed used the post 2007 DST rules)
Server Time: Monday, March 15, 2004 10:15:00 AM
JSON Serialization: /Date(1079374500000)/
JS Time Formated: 11:15 (failed used the post 2007 DST rules)
最後兩項無法正確序列化數據。
在此測試案例中,服務器和客戶端託管在同一臺計算機上,並且已應用所有修補程序。從服務器
public ActionResult GetDates()
{
return Json(GetTimeList(),
"text/x-json",
System.Text.Encoding.UTF8, JsonRequestBehavior.AllowGet);
}
private List<TestModel> GetTimeList()
{
List<TestModel> model = new List<TestModel>();
DateTime temp = new DateTime(2003, 1, 1, 10, 15, 0);
int HourInc = 24;
for (int i = 0; i < 2200; i ++)
{
model.Add(new TestModel { ServerDate = temp.ToLongDateString() + " " + temp.ToLongTimeString(), ServerTime = temp, ServerTimeString = temp.ToString("HH:mm") });
temp = temp.AddHours(HourInc);
}
return model;
}
代碼從客戶端
代碼片段
<script type="text/javascript">
$(function() {
$.getJSON('/test/GetDates', function (data) {
var newhtml = '';
var s = '<td>';
var e = '</td>';
newhtml = "<tr><th>ServerDate</th><th>ServerTime</th><th>JsonDate</th><th>JsaonFormatedTime</th></tr>";
$.each(data, function() {
var formatedTime = formatDateTime(parseJSON(this.ServerTime))
var st = formatedTime == this.ServerTimeString ? "pass" : "fail";
newhtml += '<tr class="' + st + '">';
newhtml += s + this.ServerDate + e;
newhtml += s + this.ServerTimeString + e;
newhtml += s + this.ServerTime + e;
newhtml += s + formatedTime + e;
newhtml + '</tr>';
})
$('#test').html(newhtml)
});
});
var reDateNet = /\/Date\((\-?\d+)\)\//i;
function parseJSON (value) {
if (value == '/Date(-62135568000000)/') return null; // .net min date
else if (reDateNet.test(value)) {
return new Date(parseInt(reDateNet.exec(value)[1], 10));
}
return value;
}
function formatDateTime(dt) {
var s = '', d = dt.getHours();
s += (d < 10 ? '0' + d : d) + ':';
d = dt.getMinutes();
s += (d < 10 ? '0' + d : d);
return s;
}
</script>
你想顯示本地時間的日期? toString()似乎將其轉換爲本地時間。 – 2011-06-01 18:04:20
@ Can Gencer - 是的,當地時間是我需要展示的。 – itsmatt 2011-06-01 18:09:56
發佈的日期似乎是正確的,即562695253060點到星期六,1987年10月31日16:15:13 GMT,這將在GMT -4東部日光下12:15。我的猜測是,序列化層出了問題... – 2011-06-01 18:36:12