34

以下のようなISO日付文字列があります

 var startTimeISOString = "2013-03-10T02:00:00Z";

以下のコードを使用してJavaScriptで日付オブジェクトに変換すると、返されます

var startTimeDate = new Date(startTimeISOString);

出力は

Date {Sun Mar 10 2013 07:30:00 GMT+0530 (India Standard Time)}

確かにISOStringを日付に変換しますが、new Date()クライアントに依存するため、ローカル時間に変換します。iso日時文字列を日付と時刻に変換するだけで、ローカル日時には変換しない方法..?

ありがとう

4

5 に答える 5

62

MDN によると:

想定されるタイムゾーンの違い

「2014 年 3 月 7 日」という日付文字列を指定すると、parse() はローカル タイム ゾーンを想定しますが、「2014-03-07」などの ISO 形式を指定すると、UTC のタイム ゾーンを想定します。したがって、これらの文字列を使用して生成された Date オブジェクトは、システムが UTC のローカル タイム ゾーンに設定されていない限り、異なる時点を表します。これは、同等に見える 2 つの日付文字列が、変換される文字列の形式に応じて 2 つの異なる値になる可能性があることを意味します (この動作は ECMAScript ed 6 で変更され、両方がローカルとして扱われるようになります)。

私はこのようにして、現地時間ではなくISO日付文字列内にある正確な時間を取得しています

 var startTimeISOString = "2013-03-10T02:00:00Z";

 var startTime = new Date(startTimeISOString );
 startTime =   new Date( startTime.getTime() + ( startTime.getTimezoneOffset() * 60000 ) );

これにより、iso 日付文字列内で同じ日時が得られます。ここでの出力は次のとおりです。

o/p

Date {Sun Mar 10 2013 02:00:00 GMT+0530 (India Standard Time)}
于 2013-03-22T10:52:40.833 に答える
16

tracevipin の投稿からの会話を要約するには:

すべての Date オブジェクトは、1970-01-01T00:00:00Z からのミリ秒単位の時間値に基づいているため、コアは UTC です。これは、同じエポックからの秒数を表す値を使用する UNIX とは異なります。

Date.prototype.toStringメソッドは、システム設定とクライアントのタイムゾーン オフセット (ローカル時間) に基づく時間を表す実装依存の文字列を返します

UTC ISO8601 時刻文字列が必要な場合は、Date.prototype.toISOStringメソッドを使用できます。必要に応じて、このメソッドの「シム」を作成するのは非常に簡単です。

最後に、 Date.parseを信頼して文字列を解析しないでください。ISO8601 形式の UTC 文字列のサポートは ES5 で指定されていますが、使用中のブラウザー間で一貫して実装されているわけではありません。幅広いブラウザサポートが必要な場合 (典型的な Web アプリケーションなど) は、文字列を手動で解析する方がはるかに優れています (難しいことではありません。その方法の例が SO にあります)。

シンプルな ISO8601 UTC タイムスタンプ パーサー:

function dateObjectFromUTC(s) {
  s = s.split(/\D/);
  return new Date(Date.UTC(+s[0], --s[1], +s[2], +s[3], +s[4], +s[5], 0));
}

toISOString の shim は次のとおりです。

if (typeof Date.prototype.toISOString != 'function') {

  Date.prototype.toISOString = (function() {
  
    function z(n){return (n<10? '0' : '') + n;}
    function p(n){
      n = n < 10? z(n) : n;
      return n < 100? z(n) : n;
    }
    
    return function() {
      return this.getUTCFullYear() + '-' +
             z(this.getUTCMonth() + 1) + '-' +
             z(this.getUTCDate()) + 'T' +
             z(this.getUTCHours()) + ':' +
             z(this.getUTCMinutes()) + ':' +
             z(this.getUTCSeconds()) + '.' +
             p(this.getUTCMilliseconds()) + 'Z';
    } 
  }());
}
于 2013-03-20T08:45:27.883 に答える
7

toStringこれは、デフォルトで日付と時刻をローカルタイムゾーンで返すメソッドを使用して日付が出力されるために発生します。このメソッドtoUTCStringは、必要な文字列を提供します。

Date実際には日付をミリ秒単位の UNIX 時間として保持し、それを操作するメソッドを提供します。

于 2013-03-20T07:04:59.470 に答える