現在の時刻を表す文字列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"
に類似した文字はありますか?
DateコンストラクターまたはDate.parse(基本的に同じもの)を使用して日付文字列を解析することを強くお勧めします。
Dateが関数として呼び出され、タイムゾーンなしでISO 8601形式の日付文字列(2015-11-24T19:40:00など)が渡された場合、次のいずれかの結果が得られます。
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のみを受け入れ、他のタイムゾーン指定を受け入れないことに注意してください(欠落している場合は上記の動作に注意してください)。
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);
}
このアプローチの利点は、渡された引数の正しい数を自動的に適用することです。これがあなたの望むものなら。