戯言

つらつらと気づいたことを書いていきます。人狼とか。

java.util.Calendar#roll()


るる鯖人狼では、朝の4時に自動でバックアップを取得するために、専用のスレッドを生成しています。
プログラム起動時に、翌朝4時に実行するように設定し、その後は24時間ごとに実行しています。

翌朝4時を設定するために、

import java.util.Calendar;

Calendar cal = Calendar.getInstance();
cal.roll(Calendar.DATE, true);
cal.set(Calendar.HOUR_OF_DAY, 4);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

とやっていました。

日付を1日進めて、翌朝の4時の実行を期待するプログラムだったのですが、3月末に起動した場合に3月1日の実行となってしまい、その後24時間毎に実行するために、延々と実行し続けるという恐ろしい状況になってしまいました…。

原因は、cal.roll(Calendar.DATE, true) で、rollメソッドは上下の位を変更することなく増減をさせます。
第二引数の true は +1 と同等なので、1を加えます。3月31日に実行すると3月1日になってしまいます。

cal.add(Calendar.DATE, +1) に変更して、4月1日になることを確認。きちんとメソッドの内容を調べてから使うべきというマヌケな話でした。

rollメソッドって、どういう時に使うんだろう…。


関連記事

管理者にだけ表示を許可する