对于国际申请,客户端(javascript,ajax)和服务器(ASP MVC)之间处理日期时间格式的首选做法是什么? ?
根据我的研究:
使用自定义模型绑定器(如
)覆盖ASP MVC的DateTime模型绑定器 public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
try
{
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
return value.ConvertTo(typeof(DateTime), CultureInfo.InvariantCulture);
}
catch (Exception ex)
{
return new DateTime();
}
}
并在客户端格式化日期:
function toISOString(d) {
var year = d.getFullYear();
var month = d.getMonth() + 1;
var date = d.getDate();
return year + '-' + month + '-' + date;
}
还有最后一个问题 - 设置了上述内容,服务器如何检查客户端的日期时间偏移或时区偏移,如果必须在进入之前考虑进入申请?
答案 0 :(得分:4)
输出ISO字符串是正确的方法。
使用JavaScript Date
的{{1}}可能会让您受益匪浅。由于并非每个浏览器都支持它,因此您需要为不支持它的浏览器提供它:
toISOString
直接来自MDN toISOString。我用它,我希望其他大多数也是。
注意if ( !Date.prototype.toISOString ) {
( function() {
function pad(number) {
var r = String(number);
if ( r.length === 1 ) {
r = '0' + r;
}
return r;
}
Date.prototype.toISOString = function() {
return this.getUTCFullYear()
+ '-' + pad( this.getUTCMonth() + 1 )
+ '-' + pad( this.getUTCDate() )
+ 'T' + pad( this.getUTCHours() )
+ ':' + pad( this.getUTCMinutes() )
+ ':' + pad( this.getUTCSeconds() )
+ '.' + String( (this.getUTCMilliseconds()/1000).toFixed(3) ).slice( 2, 5 )
+ 'Z';
};
}() );
}
代表祖鲁时间(GMT)。您可以使用午夜(Z
)来表示没有时间。就个人而言,我倾向于不关心我做的事情的毫秒部分,我省略了它(时间分辨率很好,直到第二个)。
只要您对ISO格式进行标准化,如果需要,您可以轻松地为服务器和客户端编写简单的解析器。
对于MVC中的T00:00:00.000Z
绑定,您应该使用方法described in this answer解析传入的值。日期/时间解析的关键是一致性,只要您可以依赖ISO格式(使用DateTime
或使用空格),就可以轻松管理它。
答案 1 :(得分:0)
dateFormat(new Date(), 'Y-m-dTH:i:s.uZ'); // Returns 2013-06-07T04:22:26.755
https://gist.github.com/poying/5942293
var dateFormat = (function () {
var keywords = {
Y: 'getFullYear',
m: 'getUTCMonth',
d: 'getUTCDate',
H: 'getUTCHours',
i: 'getUTCMinutes',
s: 'getUTCSeconds',
u: 'getUTCMilliseconds'
};
function pad(number) {
var r = String(number);
if ( r.length === 1 ) {
r = '0' + r;
}
return r;
}
return function dateFormat(date, format) {
var str = '';
var i, len = format.length;
for (i = 0; i < len; i += 1) {
if (keywords.hasOwnProperty(format[i])) {
str += pad(Date.prototype[keywords[format[i]]].call(date));
} else {
str += format[i];
}
}
return str;
}
})();