【问题标题】:Dealing with DateTime format for international application处理国际申请的日期时间格式
【发布时间】:2013-07-04 18:03:52
【问题描述】:

对于国际应用程序,在 client(javascript、ajax)和 server (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 偏移量,如果在开始之前必须考虑到这一点进入应用程序?

【问题讨论】:

  • 请查看 Wikipedia 的规范版本 ISO8601,了解当日期和时间值按照 ISO-8601(UTC - 2013-07-06T02:28Z 或带时区... 2013-07-06T09:28+07:00)
  • ISO 是要走的路。 :) 如果您打算在客户端对日期格式进行更多操作,请查看moment.js

标签: javascript asp.net-mvc datetime


【解决方案1】:

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

使用 JavaScript DatetoISOString 可能会让您受益。由于并非所有浏览器都支持它,因此您需要为不支持的浏览器提供它:

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 绑定,您应该使用方法 described in this answer 解析传入的值。日期/时间解析的关键是一致性,只要你可以依赖 ISO 格式(使用T 或使用空格),那么你就可以轻松管理它。

【讨论】:

  • 谢谢!我尝试了 javascript toISOString() 并测试它在某些浏览器上不起作用。谢谢!
  • 在使用toISOString之前应该粘贴上面的代码。它实际上并不需要任何准备就绪的东西,因为它不会影响文档/结构(因此您可以将它存储在某个脚本文件中,该脚本文件会加载到需要它的每个页面上)。您可能会对 "polyfills" 感兴趣。
  • 对于服务器到客户端,JSON.Net 将为您执行此操作 - 除非当前代码在 IE9 及以下版本中触发错误:stackoverflow.com/a/17182430/176877
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多