Объект javascript Date из IE не может автоматически привязываться к Datetime в ASP.NET MVC

У меня есть сайт, который использует календарь jquery для отображения событий. Я заметил, что при использовании системы из IE (все версии) ASP.NET MVC не сможет привязать дату и время к действию, которое отправляет правильные события.

Последовательность событий происходит следующим образом.

  • Сообщения календаря на сервере для получения событий
  • Сервер ActionMethod принимает дату начала и окончания, автоматически привязан к объектам datetime.

В каждом браузере, отличном от IE, дата начала и окончания проходит через:

Mon, 10 Jan 2011 00:00:00 GMT

Когда IE помещает дату, она проходит через

Mon, 10 Jan 2011 00:00:00 UTC

ASP.NET MVC 2 не сможет автоматически привязать это к параметру метода действия.

Есть ли причина, почему это происходит? Код, который отправляется на сервер, выглядит следующим образом:

data: function (start, end, callback) {
        $.post('/tracker/GetTrackerEvents', { start: start.toUTCString(), end: end.toUTCString() }, function (result) { callback(result); });
    },

Ответ 1

Я столкнулся с той же проблемой, и решил ее с помощью функции JavaScript Date().toISOString() (вместо замены строки).

См. здесь doc.

DateTime и DateTimeOffset будут обрабатывать это правильно независимо от отправки браузером (в моем ограниченном тестировании IE, Firefox и Chrome).

Итак, я отправляю дату на контроллер как это (это мой объект JS):

var dateObject = new Date();
dateObject.toISOString()

И сервер может анализировать данные так (.NET - в контроллере):

DateTimeOffset timeInGMT = DateTime.Parse(dateString).ToUniversalTime(); //for the time in GMT
DateTime timeOnClient = DateTime.Parse(dateString); //for time as it was set on the client.

Ответ 2

попробуйте заменить

start.toUTCString()

с

start.toUTCString().replace('UTC','GMT')

и посмотрите, не устранит ли это проблему для вас:)

Ответ 3

Когда я использую функцию .toUTCString() в IE, у меня были проблемы с UTC vs GMT, а также с ведущими нулями.

Это то, что я использую для отправки даты UTC в ASP.NET MVC:

function getUTCString (date) {

    function pad(n) { return n < 10 ? "0" + n : n }    

    var weekday = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
    var month = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];

    return weekday[date.getUTCDay()]
        + ", " + pad(date.getUTCDate())
        + " "  + month[date.getUTCMonth()]
        + " "  + date.getUTCFullYear()
        + " "  + pad(date.getUTCHours())
        + ":"  + pad(date.getUTCMinutes())   
        + ":" + pad(date.getUTCSeconds())
        + " GMT"; 
};

Ответ 4

Я также столкнулся с этой странной ситуацией. Замена UTC на GMT в строке даты решила мою проблему, но я хотел искать другой способ (замена строк иногда вызывает проблемы:)).

Я придумал следующее решение, которое хорошо работало в IE, Chrome и Firefox:

var myUTCDateString = (function(d) {
          return d.getUTCFullYear() + "-" + (d.getUTCMonth() +1) + "-" +  d.getUTCDate() + " " + d.getUTCHours() + ":" + d.getUTCMinutes() + ":" + d.getUTCSeconds();
     })(new Date());

myUTCDateString - это что-то вроде "2012-1-3 21:47:49".

Ответ 5

Я нашел здесь и модифицировал помощника:

// #region Date.prototype.toISONonUtcString
// add Date prototype toISONonUtcString function if it doesn't yet exist
if ($.isFunction(Date.prototype.toISONonUtcString) === false) {
Date.prototype.toISONonUtcString = function () {
    var pad = function (n, places) {
        n = n.toString();
        for (var i = n.length; i < places; i++) {
            n = "0" + n;
        }
        return n;
    };
    var d = this;
    return pad(d.getFullYear(), 4) + '-' + pad(d.getMonth() + 1, 2) + '-' + pad(d.getDate(), 2) + 'T' +
                pad(d.getHours(), 2) + ':' + pad(d.getMinutes(), 2) + ':' + pad(d.getSeconds(), 2) + '.' +
                pad(d.getMilliseconds(), 3);
};
}
// #endregion