DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance(); for (int i = 0; i < 12; i++) { cal.add(Calendar.MONTH, 1); System.out.println(df.format(cal.getTime())); }
nヵ月後,あるいはnヵ月前の暦日が存在する場合は、おかしくなりませんよ。 $ date -d '2012-03-31 2 months ago' '+%m-%d' 01-31 $ date -d '2012-03-31 2 months' '+%m-%d' 05-31
暦日が存在しない場合に後ろにずらすので、前方向か後方向かで差が出るということ。 日数で与えれば期待した結果になります。 $ date -d '2012-03-31 31 days ago' '+%m-%d' 02-29 $ date -d '2011-03-31 31 days ago' '+%m-%d' 02-28
バグの原因 (スコア:0)
うるう年判定なんて、一回プログラム書いてテストしたらまず変更しないだろうし、インターフェイス気に入らないから作り直すっていうようなインターフェイスにはならないと思うのですが。
「小さいから簡単だろw」って思って毎回作り直してるんですかね。
Re: (スコア:0)
「こんなもの、ライブラリを使うまでもない」。
そして罠に嵌る。
Re: (スコア:0)
いやあライブラリ使っても油断してると簡単に罠にはまりますよ。
たとえば任意の日付の1ヵ月後、2ヵ月後、…12ヵ月後の日付までを求める処理をJavaで
みたいにしちゃうとか。
Re: (スコア:1)
ここでいうライブラリとは、「任意の日付のnカ月後の日付を求める処理」そのものの事ですよ。
Re: (スコア:0)
そんなのdateコマンドでとググったら面白いの見つけた。
http://shellscript.sunone.me/date.html [sunone.me]
#私もバグ作るとこだったか。
1ヶ月後だとそんなに違和感は無いが、1ヶ月前だとおかしなことになるという話.
date -d '2012-03-31 1 months ago' '+%m'
"nヵ月後"だとまず暦日でしょうけど、存在しない日は月末とみなすのか、翌日に繰り下げるのかとか稼働日なのか解釈はいろいろあるし。
Re:バグの原因 (スコア:0)
> 1ヶ月後だとそんなに違和感は無いが、1ヶ月前だとおかしなことになるという話.
1月31日の1ヵ月後でも同じ問題が起きるはずなので(試してないけど)前か後かの問題じゃないような。
> 解釈はいろいろあるし。
まあいろいろあるんですけど、(営業日とか考慮しないで) 1月31日の2ヵ月後が平年は3月28日、閏年は3月29日になるのが仕様というのは、そういうプログラムを書いてしまった後で言い張る場合以外にはなかなかないのではないかと。
Re: (スコア:0)
1月31日の"1ヵ月後"だと、「月末までじゃ日数少なくなっちゃうよ。存在しない日付の分,3月に食い込んでもいいよね?」というのはよくあるよね。ね?
Re: (スコア:0)
nヵ月後,あるいはnヵ月前の暦日が存在する場合は、おかしくなりませんよ。
$ date -d '2012-03-31 2 months ago' '+%m-%d'
01-31
$ date -d '2012-03-31 2 months' '+%m-%d'
05-31
暦日が存在しない場合に後ろにずらすので、前方向か後方向かで差が出るということ。
日数で与えれば期待した結果になります。
$ date -d '2012-03-31 31 days ago' '+%m-%d'
02-29
$ date -d '2011-03-31 31 days ago' '+%m-%d'
02-28