【问题标题】:DateTime display is one hour off... sometimes日期时间显示关闭一小时......有时
【发布时间】:2011-06-01 17:56:13
【问题描述】:

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

想法?

【问题讨论】:

  • 您想以当地时间显示日期吗? toString() 似乎将其转换为本地时间。
  • @Can Gencer - 是的,我需要显示当地时间。
  • 发布的日期似乎是正确的,即 562695253060 指向星期六,1987 年 10 月 31 日 16:15:13 GMT ,即东部日光下 GMT -4 的 12:15。我的猜测是序列化层出了点问题……
  • 仅供参考确保您的盒子是最新的。我知道有一个补丁可以调整窗户上的夏令时。 support.microsoft.com/gp/cp_dst

标签: asp.net-mvc json datetime


【解决方案1】:

这是我在测试 MVC3 中发现的(不是真正的答案)。如果要序列化的 DateTime 是 2007 年之前在美国更改 DST 时,则在处理落入更改 DST 的漏洞的 DateTimes 时,服务器上发生的任何日期序列化都将延迟 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>

【讨论】:

    【解决方案2】:

    我做了一些玩弄这个..

      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 GMT”。

    所以在我看来,您的日期存储或从数据库中读取的方式有问题。

    new Date(..) 根据 1970 年 1 月 1 日 00:00:00 UTC 计算日期,我想 ASP.NET 中的内置 JSON 序列化程序在序列化它们时会做同样的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2011-02-08
      相关资源
      最近更新 更多