我有一个使用EF 4.1的ASP.NET MVC 3应用程序。我从数据库中提取一些数据,包括一些DateTime信息,并将其显示在jqGrid中。通常情况下显示的日期是正常的,但是当我的jqGrid显示时某些时间会被关闭一小时,我相信这可能是因为应用了夏令时。
例如,检索到的数据包括如下日期:
PromoStartDate = {10/31/1987 11:14:13 AM}
但页面上显示的内容(jqGrid newformat= 'G:i m/d/Y'
)是:
12:14 10/31/1987
关闭了一个小时。看看Firebug,我看到响应中的PromoStartDate是::
"PromoStartDate":"\/Date(562695253060)\/"
通过jsFiddle(http://jsfiddle.net/u9yMM/2/)运行我得到:
Sat Oct 31 1987 12:15:13 GMT-0400 (Eastern Daylight Time)
使用我的机器的时区调整浏览器的时间(例如,设置为大西洋时间调整所有+1小时)但上述日期仍然错误(意味着它仍然是1小时关闭)。
JsonResult有我期望的内容(即该条目的时间值是11:14:13)所以我现在对这个有点困惑。
想法?
答案 0 :(得分:1)
这是我在测试MVC3时发现的(不是真正的答案)。如果要序列化的DateTime是在2007年美国更改DST之前,那么当处理落入DST更改的洞中的DateTime时,服务器上发生的任何日期序列化将是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>
答案 1 :(得分:0)
我做了一些玩这个..
var date = new DateTime(1987, 10, 31, 11, 14, 13, DateTimeKind.Utc);
return Json(new {Date = date}, JsonRequestBehavior.AllowGet);
这会返回{"Date":"\/Date(562677253000)\/"}
,这似乎是正确的。在JavaScript中,
new Date(562677253000).toUTCString()
评估为“星期六,1987年10月31日格林威治标准时间11:14:13”。
所以在我看来,你的日期存储或从数据库中读取的方式有问题。
new Date(..)
根据UTC的1/1/1970 00:00:00计算日期,我认为ASP.NET中内置的JSON序列化程序在序列化时也会这样做。