1. ホーム
  2. javascript

[解決済み] Date.parseが不正確な結果を出すのはなぜですか?

2022-03-14 03:32:56

質問

ケース・ワン

new Date(Date.parse("Jul 8, 2005"));

出力します。

2005年7月8日(金)00:00:00 GMT-0700 (PST)

ケース2

new Date(Date.parse("2005-07-08"));

出力します。

2005年7月7日(木)17:00:00 GMT-0700 (PST)


なぜ2番目のパースが正しくないのですか?

解決方法は?

第5版の仕様が出るまでは Date.parse メソッドは完全に 実装依存 ( new Date(string) は、以下のものと同等です。 Date.parse(string) の代わりに数値を返すことを除けば、後者は Date ). 第5版の仕様書では、この要件に加えて 簡略化 (そして若干不正確) ISO-8601 (また JavaScriptで有効な日付時刻文字列は何ですか? ). しかし、それ以外には いいえ を要求している。 Date.parse / new Date(string) を受け入れるしかなかった。 Date#toString を出力する(それが何であるかは明言しない)。

ECMAScript 2017 (第 8 版) の時点で、実装はその出力をパースするために Date#toStringDate#toUTCString が、その文字列のフォーマットは指定されていない。

ECMAScript 2019 (第9版) の時点では、以下のような形式です。 Date#toString Date#toUTCString と指定されている。

  1. ddd MMM DD YYYY HH:mm:ss ZZ [(タイムゾーン名)]。
    例:Tue Jul 10 2018 18:39:58 GMT+0530 (IST)
  2. ddd, DD MMM YYYY HH:mm:ss Z
    例)2018年7月10日(火)13:09:58 GMT

さらに2つのフォーマットを提供することで Date.parse は新しい実装で確実にパースできるはずです(サポートはどこでもできるわけではなく、非準拠の実装がしばらくは使われ続けることに注意してください)。

日付文字列は手動でパースすることをお勧めします。 日付コンストラクタ は、曖昧さを避けるために、年、月、日の引数で使用されます。

// parse a date in yyyy-mm-dd format
function parseDate(input) {

  let parts = input.split('-');

  // new Date(year, month [, day [, hours[, minutes[, seconds[, ms]]]]])
  return new Date(parts[0], parts[1]-1, parts[2]); // Note: months are 0-based
}