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分が出てますね!