dateオブジェクトの問題点と検証方法


日付は悪名高いJavaScriptの一部です.関数は一貫性がなく、しばしば奇妙な結果を得る.ちょうど日付コンストラクターを見て、多くの問題に気づくことができます.整数をパラメータとして渡すと、タイムスタンプです.その整数を文字列に変換すると、年になります.また、このポストでは、私はいくつかをカバーしています.次に、その日付が正しい値を検証する方法の例を示します.

日付クラスの問題点

コンストラクタと単一パラメータ
前述のように、コンストラクタは、渡されたパラメータの型と数に基づいて、最初のパラメータを扱います.コンストラクタがパラメータとして1つの数だけを受け取るとき、これはタイムスタンプです.そのパラメータがストリングであるならば、それは1年です.複数の数値パラメータを持つ場合、それらは年を表す最初の要素、2番目の月、および3番目を表します.

月の値
dateオブジェクト内の月は特別な場合です.すべての値が1から始まる間、月はゼロから始まります.したがって、SetAndメソッドを使用して1月に設定したい場合は、値ゼロを渡す必要があります.これはすべてのユースケースでは動作しません.ISO日付形式を使用して日付のインスタンスを作成している場合、1月よりも、値1を使用する必要があります.奇妙で、矛盾して、私は知っています.

越流
上の問題は数ヶ月です.しかし、あなたが12を渡すならば、何が起こりますか?この場合、エラーはありません、そして、あなたは月が1月である日付のインスタンスを得ます.

その他の問題
日付の設定と年の値、GetDayとGetDateを取得し、多くの他の多くの問題があります.私は彼らのより多くを書き留めている時間を過ごすことができたので、それをスキップして、バリデーションにジャンプしましょう.

検証
日付のインスタンスをいくつかの方法で作成できます.つは、コンストラクタのパラメタとしてISO日付形式を通過しています.そして、この場合、無効な値を渡すことは「無効な日付」メッセージを与えます.問題は、コンストラクタまたはセッターの整数パラメータを使用する場合です.この場合、dateオブジェクトはオーバーフローすることができます.たとえば、日付を32番目に設定している場合は、次の月(最初の月が31日)の日と日のインスタンスを取得します.

gettersでチェックする
このメソッドは、ビット反復では最も簡単です.ゲッターを使用して取得する値を使用して作成する値を比較することができます.それらのすべてが等しいなら、日付は有効です.それ以外の場合、いくつかの値が無効です.このメソッドの肯定的な側面は、サードパーティのライブラリに依存しない、それは常に動作します.
const isValid = (year, month, day) => {
    const date = new Date(year, month, day);
    return date.getDate() === day &&
        date.getMonth() === month &&
        date.getFullYear() === year;
}

包む
日付はJavaScriptの痛みポイントの1つです.Dateオブジェクトは動作するのが面倒です.そして、はい、検証は、瞬間と日付のヘルパーのようなサードパーティ製ライブラリの多くを使用して行うことができますが、それは常にオプションではないかもしれません.validate日付への依存関係の追加は、あまりにも多いかもしれません.それがなぜバニラJavaScriptでそれを行う方法のアイデアを持っていることが不可欠です.そして、私の意見では、これは最善の方法です.
さらに、あなたは私に従って、GitHub、または.