2015-11-25 10 views
19

私は現在の時刻を表す文字列を持っています:2015-11-24T19:40:00。どのようにしてこの文字列をJavascriptで解析し、この文字列で表される日付をとして取得するのですか?ローカル時間いくつかの制限のため、ライブラリmomentは使用できませんが、jqueryは許可されています。私は誰かが前にこの質問をしていることを知っているが、その答えは、例えばmomentJavascript:現地時間帯としてDateに文字列を解析します

を使用し、私はカリフォルニアでスクリプトを実行する場合、この文字列は午後7時(太平洋標準時)に相当するであろうが、私はその後、NYでスクリプトを実行する場合、この文字列は東部時間を表しますか?

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

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

Chromeは、UTC時間(Tue Nov 24 2015 11:40:00 GMT-0800 (Pacific Standard Time))としてそれを消費

が、Firefoxは私の地元のPACIFICとしてそれを消費時間(Tue Nov 24 2015 19:40:00 GMT-0800 (Pacific Standard Time)

のようにstrに "Z"を追加しようとしました、両方のブラウザが私にUTC時間を与えます。 "Z"には、すべてのブラウザ(少なくともchrome、Firefox、Safari)に文字列をローカルタイムゾーンとして解析するような似た手紙がありますか?

答えて

29

DateコンストラクタまたはDate.parse(これらは本質的に同じものです)を使用して日付文字列を解析することを強くお勧めします。日付を関数として呼び出すとタイムゾーンなしでISO 8601形式の日付文字列を渡された場合

(のような2015-11-24T19:40:00)には、次のいずれかの結果を得ることがあります。

  1. 前ES5のimplementaitonsは、何として(例えばIE 8のような)も、NaNを出力し、それを扱うことが
  2. ES5準拠した実装はUTCタイムゾーンとして扱います
  3. ECMAScriptの2015準拠の実装は、(ISO 8601と一致している)ローカルとして扱います

Dateオブジェクトの時刻値はUTCで、オフセットはシステム設定に基づいています。 Date to outputを送信する場合、通常はDate.prototype.toStringという結果になります。これは、通常、システム設定に基づいて日付と時刻を表す、人間には読みやすい文字列です。

日付文字列を解析する最もよい方法は、手動で行うことです。 ISO文字列の解析がDate.parseを使用していること

/* @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'));

注:は形式が一貫して有効であることが保証されている場合は、ローカルの日付とISO形式の文字列を解析することと同じくらい簡単ですUTCのみを受け入れますが、それ以外のタイムゾーンの指定は受け付けません(上記の動作が欠落している場合)。

+0

偉大な答え!!! –

+0

を副疑問に思っていますが、 'new Date()'は常に現在のローカル時刻を返しますか?そうでない場合は、どうすれば現在の現地時間を取得できますか?少なくともChromeとFirefox用にテストしてください。基本的には、 '' 2015-11-24T19:40:00 "' – Simo

+1

のように、現在の時刻と文字列で表される指定時刻の差(秒)を取得する必要があります。時刻値が現在のUTC時刻に設定され、システム設定に基づいてオフセットされたDateオブジェクト。その提示方法は、[* toString *](http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.tostring)、[* toISOString *]というメソッドによって決まります。 (http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.toisostring)、[* toUTCString *](http://www.ecma-international.org/ecma-262 /6.0/#sec-date.prototype.toutcstring)、[* toLocaleTimeString *](http://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.tolocaletimestring)など – RobG

-1

ここで、Dateは複数の引数を持つコンストラクタとして呼び出され、指定された引数は現地時間を表します。

数字がどこにいる我々はすでに知っているので、私はまた)(のstring.Splitを使用するよりもはるかに高速な方法があります。

return new Date(Number(date.substring(0, 4)), Number(date.substring(5, 7))-1, 
       Number(date.substring(8, 10)), Number(date.substring(11, 13)), 
       Number(date.substring(14, 16)), Number(date.substring(17, 19))); 

これが作業および/または「T」と「Zなしになります文字列はまだまともなパフォーマンスを持っています。これをTypeScriptでコンパイルするため、明示的な数値変換(parseIntよりも高速で優れています)を追加しました。 番号

+0

これは本当にハードコーディングする必要はありません – tcoulson

3

RobGの素晴らしい回答のバリエーション。それは矢印記法と拡散オペレータに依存している として、これはあなたがエッジJavaScriptを出血実行することを必要とすること

注意

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

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

+0

@IAfanasov申し訳ありませんが、私はあなたがもう少し詳しく説明しなければならないと思います。私はあなたが何を言おうとしているのか理解していません。 –

+0

申し訳ありませんが、私は1行のコードを見逃しました。 – IAfanasov

関連する問題