Dayjs(「2」)を印刷した場合、なぜ「2001-02-01 T 00:00:00+09:00」と表示されるのか
12673 ワード
最近、私は会社で日付と時間を計算するときに使うライブラリを変更する仕事をしています.
現在motormという名前のライブラリを使用しており、メンテナンスが中断されている問題が発生しています.
そこでmomentライブラリをdayjsライブラリに置き換えることにした.
ある程度の置き換え作業やテストコードの作成を行うと、奇妙なものが発見されました.
私は失敗したテストケースを作成しています.もちろんdayjsは文字列「2」が無効なフォーマットの文字列だと思っています.
だからdayjs("2").isValid()の結果値予想
何だったっけ???その後、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の
dayjs公式ドキュメントによると、
これらのことから,dayjsライブラリ(フォーマットを別途設定しなければ)は個別のパーティションロジックを用いず,
したがって、dayjsライブラリではなく、/457914、クラスがこのように文字列「2」をグループ化している理由を理解する必要があります.
最終的にjavascript sparkドキュメントを調べました.
Sparkドキュメントを完全に理解しているわけではありませんが、 0個のパラメータが渡されると、現在時刻設定の 1個 1個の数値タイプのパラメータが渡された後、パラメータ値をunixタイムスタンプと判断し、日付を計算し、 文字列タイプのパラメータが渡された場合、その文字列をグループ化して返す その他省略… Sparkドキュメントによると、
ただし、文字列がISO 8601形式でない場合、Sparkを実現する場所指定に従って文字列をグループ化する.
すなわち、実際には、ISO 8601形式以外の文字列をどのようにグループ化するかは規定されていない.
実際には、ブラウザごとに文字列「2」をグループ化した結果が異なります.
Chromeでは、文字列「2」は2001年02月01日00:00分00秒にKSTに分割された.
なぜJavaScriptがこんな感じなのか気になります😅)
Node.js環境でもそうですが、特にブラウザでは、
ISO 8601形式以外の文字列をグループ化すると、異なるブラウザで異なる日付情報を取得できます.
また、Dayjsライブラリを使用して文字列をパーティション化する場合は、customフォーマットを設定しstrictモードを使用する必要があります.
(私はよく読んだことがないのでわかりませんが、Dayjs公式文書であってもISO 8601形式ではない文字列をグループ化する場合、一致したグループ結果を得るためにはcustom形式を設定しなければなりません.)
現在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
クラスインスタンスが返されます.ジェネレータを呼び出すときに渡されるパラメータの個数やタイプによって、操作が全く異なります.Date
クラスインスタンスが返されます.Date
クラスタイプのパラメータが渡されると、パラメータで渡されたDate
クラスインスタンスクローンの新しいインスタンスが返されます.Date
クラスインスタンスを返す.Date
クラスインスタンス.(重要)文字列のグループ化方式はDate
クラスparse方式と同様である.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形式を設定しなければなりません.)
Reference
この問題について(Dayjs(「2」)を印刷した場合、なぜ「2001-02-01 T 00:00:00+09:00」と表示されるのか), 我々は、より多くの情報をここで見つけました https://velog.io/@newwwbi/dayjs2-를-출력해보면-2001-02-01T0000000900-가-출력되는-이유テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol