处理国际申请的DateTime格式

时间:2013-07-07 03:59:02

标签: javascript asp.net-mvc datetime

对于国际申请,客户端(javascript,ajax)和服务器(ASP MVC)之间处理日期时间格式的首选做法是什么? ?

根据我的研究:

  • 服务器格式:yyyy-mm-dd
  • 客户端格式:yyyy-mm-dd

使用自定义模型绑定器(如

)覆盖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;
    }

还有最后一个问题 - 设置了上述内容,服务器如何检查客户端的日期时间偏移时区偏移,如果必须在进入之前考虑进入申请?

2 个答案:

答案 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;
    }
})();