java.util.Calendar (仕事用の覚書き)


このjava.util.Calendar、中々曲者。

今回問題になったのは、年に数回しか発生しない特殊なバグ。



今日は5月31日。

今日の日付をベースにしてることが問題の原因に。



と、ここまで日本語で書いて挫折。

私はアメリカでプログラミングを学んだ。

独学で少し齧って、大学でクラスを取り、

コンピューター・サイエンスを専攻した。



プログラミングを日本語で勉強したことがないせいか、

私は日本語のプログラミング用語を全くと言っていいほど知らない。

ものによってはそのままカタカナにすれば通じるものもあるみたいだけど、

ちゃんと日本語の専門用語があるものもあるらしく、

そこら辺の区別が全くつかない。

これは数学、物理にも同じことが言える。



数学は高校で完全に落ちこぼれ、

文系だった私は物理なんて勉強したこともなかった。

この2つの教科も日本語の参考書なんかめくってみても

さっぱりわからなかった。

用語を知らないから問題が今ひとつよくわからない。

だから問題も解けない。

英語なら(今物理の問題を解けと言われると余り自信はないが)

問題の意味がわからない、ということはまずないと思う。



だから仕事に関して説明するには英語でないと、

全然ぴんと来ないし、

ちゃんと正しい言葉を使えてないような気がするし

(多分気がするだけではないと思うし)

本当に心元ない。

なので以下英語(そして少々専門的な話)になります。








So, here's the problem I had...



We store month/year data in database. I have the below code:

line 1: Calendar cal = Calendar.getInstance();

line 2: cal.set(Calendar.MONTH, vo.getMonth() - 1); //month starts at 0


Let's say vo represents value object returned from database. When calling vo.getMonth(), it returns 4, which represents month of April. However, Java uses 0 to 11 for month, April would have to be 3, so I I do line 2.



Now, line 1 sets cal's month of day to 31 because it is 05/31/2005 today. Setting month to 3 will make the date to be 04/31/2005. Since there's no 31st day in April, it gets rolled to 05/01/2005, and that is the problem I have.



My theory can be verified by testing the same code tomorrow. IT SHOULD NOT HAPPEN!!!



Now, to get around it, would to insert between line 1 and 2 the following:
line 2: cal.set(Calendar.DAY_OF_MONTH, 1); // set day of the month to 1st




Problem solved! (well, almost...)