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 に答える