2007/04
意外とどうやればいいかわかりにくいのが、日付の計算です。
一番シンプルなのがCalendarをm秒に直して引き算して1日のm秒で割る
方法です。
package sample; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.GregorianCalendar; public class NextTime { /** 日付整形フォーマット */ private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); public static void main(String[] args) { //GregorianCalendarの月は0から始まる。3が4月。 test(new GregorianCalendar(2007, 3, 1, 03, 00)); test(new GregorianCalendar(2007, 3, 1, 03, 01)); test(new GregorianCalendar(2007, 3, 1, 03, 30)); test(new GregorianCalendar(2007, 3, 1, 03, 31)); test(new GregorianCalendar(2007, 3, 1, 03, 59)); test(new GregorianCalendar(2007, 3, 1, 04, 00)); } /** * getNext30Miniteを実行し結果を標準出力する。 * @param calendar 変換する日付 */ private static void test(Calendar calendar) { System.out.print(dateFormat.format(calendar.getTime())); System.out.print(" → "); calendar = getNext30Minite(calendar); System.out.println(dateFormat.format(calendar.getTime())); } /** * 渡された日付の分が次に00または30となる時刻となる日付を返す。 * 例<br> * 入力 03:00 → 変換後 03:00<br> * 入力 03:01 → 変換後 03:30<br> * 入力 03:30 → 変換後 03:30<br> * 入力 03:31 → 変換後 04:00<br> * 入力 03:59 → 変換後 04:00<br> * 入力 04:00 → 変換後 04:00<br> * * @param calendar 変換する日付 * @return 渡された日付の次の00分または30分となる時刻 */ public static Calendar getNext30Minite(Calendar calendar) { int minute = calendar.get(Calendar.MINUTE); int minuteSub = minute - 30; int addValue = minuteSub * -1; if (minuteSub > 0) { addValue = 60 - minute; } calendar.add(Calendar.MINUTE, addValue); return calendar; } }
[実行結果]
>javac -d . NextTime.java
>java sample.NextTime
2007/04/01 03:00:00 → 2007/04/01 03:30:00
2007/04/01 03:01:00 → 2007/04/01 03:30:00
2007/04/01 03:30:00 → 2007/04/01 03:30:00
2007/04/01 03:31:00 → 2007/04/01 04:00:00
2007/04/01 03:59:00 → 2007/04/01 04:00:00
2007/04/01 04:00:00 → 2007/04/01 04:30:00
>java sample.NextTime
2007/04/01 03:00:00 → 2007/04/01 03:30:00
2007/04/01 03:01:00 → 2007/04/01 03:30:00
2007/04/01 03:30:00 → 2007/04/01 03:30:00
2007/04/01 03:31:00 → 2007/04/01 04:00:00
2007/04/01 03:59:00 → 2007/04/01 04:00:00
2007/04/01 04:00:00 → 2007/04/01 04:30:00
ぴったり次の30分が出てますね!