web-dev-qa-db-ja.com

Javascript:日付を文字列としてローカルタイムゾーンとして解析する

現在の時刻を表す文字列2015-11-24T19:40:00があります。この文字列をJavascriptで解析して、この文字列がLOCAL TIMEとして表す日付を取得するにはどうすればよいですか? 何らかの制限のため、ライブラリmomentは使用できませんが、jqueryは許可されます。誰かが以前にこの質問をしたことは知っていますが、答えはmomentを使用しました

たとえば、カリフォルニアでスクリプトを実行すると、この文字列は太平洋時間の午後7時を表しますが、NYでスクリプトを実行すると、この文字列は東部標準時間を表しますか?

私は次のことを試しましたが、ChromeとFirefoxは異なる結果を与えます:

var str = "2015-11-24T19:40:00";
var date = new Date(str);

Chromeは[〜#〜] utc [〜#〜] time(Tue Nov 24 2015 11:40:00 GMT-0800 (Pacific Standard Time))として消費します。

しかし、Firefoxはそれをローカルとして消費します[〜#〜] pacific [〜#〜] time(Tue Nov 24 2015 19:40:00 GMT-0800 (Pacific Standard Time)

このvar date = new Date(str+"Z");のようにstrに "Z"を追加しようとすると、両方のブラウザーでUTC時間が取得されます。すべてのブラウザ(少なくともchrome、Firefox、Safari)に文字列をローカルタイムゾーンとして解析するように指示する"Z"に類似した文字はありますか?

28
Simo

DateコンストラクターまたはDate.parse(基本的に同じもの)を使用して日付文字列を解析することを強くお勧めします。

Dateが関数として呼び出され、タイムゾーンなしでISO 8601形式の日付文字列(2015-11-24T19:40:00など)が渡された場合、次のいずれかの結果が得られます。

  1. ES5以前の実装では、NaN(IE 8など)
  2. ES5準拠の実装では、UTCタイムゾーンとして扱われます
  3. ECMAScript 2015準拠の実装では、ローカルとして処理されます(ISO 8601に準拠)

Dateオブジェクトには、UTCである時刻値と、システム設定に基づくオフセットがあります。日付を出力に送信すると、通常、Date.prototype.toStringの結果が表示されます。これは実装に依存し、人間が読める日付と時刻を表す文字列です。通常は、システム設定。

日付文字列を解析する最良の方法は、手動で行うことです。形式が一貫していて有効であることを確認したら、ISO形式の文字列をローカル日付として解析するのは次のように簡単です。

/*  @param {string} s - an ISO 8001 format date and time string
**                      with all components, e.g. 2015-11-24T19:40:00
**  @returns {Date} - Date instance from parsing the string. May be NaN.
*/
function parseISOLocal(s) {
  var b = s.split(/\D/);
  return new Date(b[0], b[1]-1, b[2], b[3], b[4], b[5]);
}

document.write(parseISOLocal('2015-11-24T19:40:00'));

Date.parseを使用したISO文字列の解析はUTCのみを受け入れ、他のタイムゾーン指定を受け入れないことに注意してください(欠落している場合は上記の動作に注意してください)。

39
RobG

RobGの素晴らしい回答のバリエーション。

矢印表記とスプレッド演算子に依存しているため、出血しているEdge JavaScriptを実行する必要があります。

function parseDateISOString(s) {
  let ds = s.split(/\D/).map(s => parseInt(s));
  ds[1] = ds[1] - 1; // adjust month
  return new Date(...ds);
}

このアプローチの利点は、渡された引数の正しい数を自動的に適用することです。これがあなたの望むものなら。

5
John Leidegren