Dayjs(「2」)を印刷した場合、なぜ「2001-02-01 T 00:00:00+09:00」と表示されるのか


最近、私は会社で日付と時間を計算するときに使うライブラリを変更する仕事をしています.
現在motormという名前のライブラリを使用しており、メンテナンスが中断されている問題が発生しています.
そこでmomentライブラリをdayjsライブラリに置き換えることにした.
ある程度の置き換え作業やテストコードの作成を行うと、奇妙なものが発見されました.
私は失敗したテストケースを作成しています.もちろんdayjsは文字列「2」が無効なフォーマットの文字列だと思っています.
だからdayjs("2").isValid()の結果値予想falseただし、テストに戻ると、結果値はtrueです.
何だったっけ???その後、dayjs("2")をコンソールに出力し、「2001-02-01 T 00:00+09:00」と表示します.
今回dayjs("3")をコンソールに出力すると、「2001-03-01 T 00:00+09:00」と表示されます.

あわてる
なぜdayjsが文字列「2」を2001年02月01日00時00秒KSTに分割したのか分かりません.
この現象の原因を究明するために、開発人生で初めてハブに焦点を当てた.
パパの力を借りて、私が発見したこの現象を英語で真剣に説明しました.

(私の質問に答えないのではないかと心配していたので、先にライブラリを用意して、メンテナンスに感謝しました)
話題を残し、4日後に回答を得た.
dayjsライブラリに貢献してくれた韓国人の回答に感謝します.

以上のシナリオから分かるようにjavascriptのDateクラスもdayjsと同様に文字列「2」を2001年02月01日00時00秒KSTに分割している.
dayjs公式ドキュメントによると、DayjsクラスはJavaScriptのDateクラスを含むRapperクラスである.
これらのことから,dayjsライブラリ(フォーマットを別途設定しなければ)は個別のパーティションロジックを用いず,Dateクラスのパーティション機能を用いたと推測される.Dateクラスの文字列「2」は2001年02月01日00:00分00秒KSTでグループ化されているため、dayjsのグループ化結果も同様である.

したがって、dayjsライブラリではなく、/457914、クラスがこのように文字列「2」をグループ化している理由を理解する必要があります.
最終的にjavascript sparkドキュメントを調べました.

Sparkドキュメントを完全に理解しているわけではありませんが、Dateクラス構築関数の働き方を簡単に紹介します.
  • Dateクラス生成者呼び出しDateキーワードがない場合、現在のUTC時間を文字列に戻します.(ああ、知らなかった🤔)
  • newクラスジェネレータがDateキーワードとともに呼び出されると、newクラスインスタンスが返されます.ジェネレータを呼び出すときに渡されるパラメータの個数やタイプによって、操作が全く異なります.
  • 0個のパラメータが渡されると、現在時刻設定のDateクラスインスタンスが返されます.
  • 1個Dateクラスタイプのパラメータが渡されると、パラメータで渡されたDateクラスインスタンスクローンの新しいインスタンスが返されます.
  • 1個の数値タイプのパラメータが渡された後、パラメータ値をunixタイムスタンプと判断し、日付を計算し、Dateクラスインスタンスを返す.
  • 文字列タイプのパラメータが渡された場合、その文字列をグループ化して返すDateクラスインスタンス.(重要)文字列のグループ化方式はDateクラスparse方式と同様である.
  • その他省略…
  • Sparkドキュメントによると、Dateクラスの解析方法で文字列をまずISO 8601形式でグループ化する.
    ただし、文字列がISO 8601形式でない場合、Sparkを実現する場所指定に従って文字列をグループ化する.
    すなわち、実際には、ISO 8601形式以外の文字列をどのようにグループ化するかは規定されていない.
    実際には、ブラウザごとに文字列「2」をグループ化した結果が異なります.
    Chromeでは、文字列「2」は2001年02月01日00:00分00秒にKSTに分割された.
    new Date('2'); // Thu Feb 01 2001 00:00:00 GMT+09:00 (한국 표준시)
    new Date('2').getFullYear(); // 2001
    new Date('2').getMonth(); // 1
    new Date('2').getDate(); // 1
    new Date('2').getHours(); // 0
    new Date('2').getMinutes(); // 0
    new Date('2').getSeconds(); // 0
    逆にSafariでは、文字列「2」が0002年01月01日08時27分52秒KSTに分割されている.
    new Date('2'); // Tue Jan 01 0002 08:27:52 GMT_0827 (KST)
    new Date('2').getFullYear(); // 2
    new Date('2').getMonth(); // 0
    new Date('2').getDate(); // 1
    new Date('2').getHours(); // 8
    new Date('2').getMinutes(); // 27
    new Date('2').getSeconds(); // 52
    Firefoxは、文字列「2」が無効な形式の文字列であると考えています.
    new Date('2'); // Invalid Date
    new Date('2').getFullYear(); // NaN
    new Date('2').getMonth(); // NaN
    new Date('2').getDate(); // NaN
    new Date('2').getHours(); // NaN
    new Date('2').getMinutes(); // NaN
    new Date('2').getSeconds(); // NaN
    Node.jsはChromeブラウザと同じV 8 JavaScriptエンジンで実行されるのでNode.jsで文字列「2」をグループ化すると、2001年02月01日00時00秒にKSTが現れる.

    なぜJavaScriptがこんな感じなのか気になります😅)
    Node.js環境でもそうですが、特にブラウザでは、Dateクラスの使用は避けたい場合があります.
    ISO 8601形式以外の文字列をグループ化すると、異なるブラウザで異なる日付情報を取得できます.
    また、Dayjsライブラリを使用して文字列をパーティション化する場合は、customフォーマットを設定しstrictモードを使用する必要があります.
    (私はよく読んだことがないのでわかりませんが、Dayjs公式文書であってもISO 8601形式ではない文字列をグループ化する場合、一致したグループ結果を得るためにはcustom形式を設定しなければなりません.)