我有一个使用jquery日历来显示事件的站点。
我注意到,在IE(所有版本)中使用系统时,ASP.NET MVC将无法将日期时间绑定到发回正确事件的操作。
事件顺序如下。
- 日历发布到服务器以获取事件
- Server ActionMethod接受开始日期和结束日期,自动绑定到datetime对象
在IE以外的每个浏览器中,开始和结束日期都是:
Mon, 10 Jan 2011 00:00:00 GMT
当IE发布日期时,它会通过as
Mon, 10 Jan 2011 00:00:00 UTC
然后,ASP.NET MVC 2将无法自动将其绑定到action方法参数。
有没有理由发生这种情况?
发布到服务器的代码如下:
data: function (start, end, callback) {
$.post('/tracker/GetTrackerEvents', { start: start.toUTCString(), end: end.toUTCString() }, function (result) { callback(result); });
},
我遇到了同样的问题,我使用JavaScript Date()的.toISOString()函数解决了它(而不是做一个字符串替换)。
请参阅此处的doc。
DateTime
和 DateTimeOffset
无论broswer发送它(在我有限的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.
试着替换
start.toUTCString()
同
start.toUTCString().replace('UTC','GMT')
并看看是否不能解决你的问题:)
当我使用该功能 .toUTCString()
在IE下,我遇到了麻烦 UTC
VS GMT
还有前导零。
这是我用来向ASP.NET MVC发送UTC日期:
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";
};
我也遇到过这种奇怪的情况。
在日期字符串中将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”。
我发现了 这里 并修改了一个帮手:
// #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