Дисплей DateTime отключен на один час ... иногда - PullRequest
0 голосов
/ 01 июня 2011

У меня есть приложение ASP.NET MVC 3, которое использует EF 4.1.Я извлекаю некоторые данные из базы данных, включая некоторую информацию 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)

Игра счасовой пояс моей машины корректирует время в браузере (например, установка Atlantic Time регулирует все + 1 час), но указанная выше дата все еще неверна (то есть она по-прежнему 1 час).

JsonResult имеет то, что я ожидаюв нем (а именно, что значение времени для этой записи равно 11:14:13), так что я сейчас немного запутался по этому поводу.

Идеи?

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Вот что я нашел в своем тестировании MVC3 (на самом деле не ответ). Если сериализуемым DateTime является до 2007 года, когда DST был изменен в США, любая сериализация дат, происходящая на сервере, будет отключена на 1 час при работе с DateTimes, попадающим в дыру, в которой был изменен DST. (http://en.wikipedia.org/wiki/DST_in_the_US). Похоже, что для всех дат используются самые последние правила летнего времени.

Пример.

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>
0 голосов
/ 01 июня 2011

Я немного поигрался с этим ..

  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() оценивается как «Сб, 31 октября 1987 11:14:13 GMT».

Так что мне кажется, что с тем, как ваши даты хранятся или считываются из базы данных, что-то не так.

new Date(..) вычисляет даты на основе 01.01.1970 00:00: 00 UTC и я полагаю, что встроенный сериализатор JSON в ASP.NET делает то же самое при их сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...