日期时间显示有一小时...有时候

时间:2011-06-01 17:56:13

标签: asp.net-mvc json datetime

我有一个使用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)所以我现在对这个有点困惑。

想法?

2 个答案:

答案 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序列化程序在序列化时也会这样做。