アーシの毎日インプット

毎日1つ以上学習する。学習した内容を公開する。を目標に自分のスキルアップを目指します。

0002/11/30の理由

スポンサードリンク

JavaのDate型のお話。

 

プログラミング言語JavaにはDate型という日付を処理するための入れ物のようなものがあります。

 

このDate型、実は日付書式でない値を入力するといい感じに解釈してくれるのがポイントです。

 

2019/12/32と入力した場合は2020/01/01と解釈してくれますし、

2020/99/01と入力した場合は2028/03/01と解釈してくれます。

 

 

では0000/00/00を入力するとどうなるのか。

 

なんと、0002/11/30と解釈されます。

 

なんで!?

 

不思議だったので0002/11/30になる理由を考えてみました。

 

まず、0000年について考えます。

当たり前ですが、西暦0年なんていうものは存在しません。

紀元前1年の翌年は西暦1年です。

なので、Javaの方で+1年の解釈を入れているのでしょう。

 

次に00月00日について考えます。

これは、00月が1月-1であることから12月として解釈され、12月00日に。

さらに、00日が1日-1であることから12月1日-1で11月30日に。

 

ここで、1月を12月に繰り下げる処理の中で、最初に桁上がり0001年が0000年に戻ります。

そして、再び実在しない0000年を実在日付にするため、Javaの方で+1年の解釈を入れているのでしょう。

 

これだけ見ると、0001/11/30になりそうですが、0002/11/30となる理由。

それは、2回行われている年+1の処理が実施されるたびに内部の日付書式を更新しているのではなく、最後に+1が2回行われて0002年という値が算出されているのではないかと考えました。

 

ここまでかんがえてみたところで、、、

百聞は一見に如かず、推論よりも実験。

 

実際にJavaを使って確認していきます。

 

せっかくなので、先日紹介したdokojavaを使ってみます。

 

 

今回用意したプログラムはこちら。

f:id:arshii:20200208064800p:plain

最初に何の変哲もない日付書式が正しく読み込まれていることを確認し、

その後、0000年00月00日など、0が含まれる日付について、Java内でどのように処理されているのかを確認します。

 

そして、実行結果がこちら。

f:id:arshii:20200208064815p:plain

予想通り!?面白い結果を得ることができました。

 

今回はJavaのDate型の深淵に近付けた気がするので大満足です。

【アーシの原点】

【頭を鍛える迷路集】


スポンサードリンク