Javaで時間の計算をミリ秒で計算し、条件分岐を作成したのでここにメモ
ポイント
- ミリ秒にする(getMsecOfDay(int hour))
- 本日の0時からのミリ秒を出す(getMsecOfDay(Date current))
- 細かくメソッド化する(isHoliday()やisNight()など)
仕様
- 平日(金曜以外)は営業時間を8-20
- 金曜日の営業時間は8-17
- 土日休み
必要なライブラリをimport
import java.util.Calendar;
import java.util.Date;
定数
// 業務終了とする時刻
private static final int FRIDAY_END_HOUR = 17;
// 平日の始業時刻
private static final int WEEKDAY_START_HOUR = 8;
// 平日の終業時刻
private static final int WEEKDAY_END_HOUR = 20;
ミリ秒
private static long getMsecOfDay(int hour) {
// N時間 * 60分 * 60秒 * 1000ミリ秒
return hour * (60 * 60 * 1000);
}
本日0時からのミリ秒
//1970/1/1~現在までのミリ秒 - 1970/1/1~現在0時までのミリ秒
private static long getMsecOfDay(Date current) {
// 現在ミリ秒 - 同日0時のミリ秒で、0時から換算したミリ秒を算出する
return current.getTime() - org.apache.commons.lang.time.DateUtils.truncate(current, Calendar.DATE).getTime();
}
土日
//土日は true を返す
private static boolean isHoliday() {
int wday = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
return wday == Calendar.SATURDAY || wday == Calendar.SUNDAY;
}
夜間の時間帯か判定
//夜20時 ~ 朝8時までの間の場合 true を返す
private static boolean isNight() {
long baseTimeMsec = getMsecOfDay(new Date());
return baseTimeMsec getMsecOfDay(WEEKDAY_START_HOUR) || getMsecOfDay(WEEKDAY_END_HOUR) <= baseTimeMsec;
}
土日と金曜17時以降
// 金曜日の17時以降、または土日の場合 true を返す
public static boolean isWeekend() {
int wday = Calendar.getInstance().get(Calendar.DAY_OF_WEEK);
long baseTimeMsec = getMsecOfDay(new Date());
// 金曜日17~または土日はサービス時間外
return (getMsecOfDay(FRIDAY_END_HOUR) < baseTimeMsec && wday == Calendar.FRIDAY) || isHoliday();
}
営業時間外
//金曜日17時以降、または土日の場合、また平日の20時〜8時の場合は true を返す
public static boolean isOutOfService() {
return isWeekend() || (isNight() && !isHoliday());
}