5

对于国际应用程序,在客户端(javascript、ajax)和服务器(ASP MVC)之间处理DateTime 格式的首选做法是什么?

根据我的研究:

  • 服务器格式: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;
    }

最后一个问题 - 设置了上述内容后,服务器如何检查客户端的DateTime 偏移量Timezone 偏移量,如果在进入应用程序之前必须考虑到这一点?

4

2 回答 2

5

输出为 ISO 字符串是正确的方法。

使用 JavaScriptDatetoISOString. 由于并非每个浏览器都支持它,因此您需要为不支持的浏览器提供它:

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';
    };

  }() );
}

这直接取自MDN toISOString。我使用它,我希望大多数其他人也是。

请注意Z祖鲁时间 (GMT) 的代表。您可以只使用午夜 ( T00:00:00.000Z) 来表示没有时间。就个人而言,我倾向于不关心我所做的毫秒部分,我忽略了它(时间分辨率可以精确到秒)。

只要您对 ISO 格式进行标准化,那么您就可以轻松地为服务器和客户端编写简单的解析器(如有必要)。

至于 MVC 中的绑定,您应该使用此答案中描述DateTime的方法解析传入的值。日期/时间解析的关键是一致性,只要您可以依赖 ISO 格式(使用空格或使用空格),您就可以轻松管理它。T

于 2013-07-07T04:06:20.893 回答
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;
    }
})();
于 2013-07-07T04:26:22.013 回答