@Slf4j
public class DateTest {
// 给出任意两个时间, 计算出该时间段内白天小时数, 夜晚小时数, 以及白天次数夜晚次数,
// 白天为 7:00-21:00; 白 14 夜 10
/**
* 先计算俩个时间之间的差多少天,在计算中间差多少个小时
* 开始 结束
* 正 正(正常的都包括7点和21点俩个时间点)
* 不 正 (小于7 或大于21)
* 不 不(都小于7 或都大于21)
* 正 不 (小于7 或大于21)
* 不 不 (都不正常) 6 23 或 23 6
*/
public static void main(String[] args) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date beginDate = sdf.parse("2020-6-20 20:59:00");
Date endDate = sdf.parse("2020-6-20 22:59:00");
System.out.println(sdf.format(beginDate));
System.out.println(sdf.format(endDate));
testDate(beginDate, endDate);
}
private static void testDate(Date beginDate, Date endDate) throws Exception {
if (beginDate.getTime() > endDate.getTime() || beginDate.equals(endDate)) {
log.info("结束时间必须比开始时间早");
return;
}
int w = 14, b = 10;//w 白天总小时数 b 黑夜小时数
int whour = 0;//白天小时数
int bhour = 0;//夜晚小时数
int wcs = 0;//白天次数
int bcs = 0;//夜晚次数
long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
long nh = 1000 * 60 * 60;// 一小时的毫秒数
long bl = 10000;//小时计算变量
long beginDateTime = beginDate.getTime();
long endDateTime = endDate.getTime();
//相隔天数的总毫秒数
long diff = endDateTime - beginDateTime;
long day = diff / nd;// 计算差多少天
long hour = diff % nd / nh + day * 24;// 计算差多少小时
//先计算整天的的数量
if (day > 0) {
whour += w * day;
bhour += b * day;
wcs += day;
bcs += day;
}
//算出整天的小时数和总小时数不相等,说明有多余的小时数
if (day * 24 != hour) {
SimpleDateFormat sdf1 = new SimpleDateFormat("HH:mm:ss");
long date1Time = Long.parseLong(sdf1.format(beginDate).replace(":", ""));
long date2Time = Long.parseLong(sdf1.format(endDate).replace(":", ""));
long wb = 70000;//07:00:00 白天开始时间
long we = 210000;//21:00:00 白天结束时间
long zero = 240000;//24:00:00 0点分界值
//1.开始正常 结束正常
if (date1Time >= wb && date1Time <= we
&& date2Time >= wb && date2Time <= we) {
if (date2Time > date1Time) {//结束>开始
//13 14 相当于 多了俩个时间差
whour += (date2Time - date1Time) / bl;
wcs += 1;
} else if (date2Time < date1Time) {
// 14 13 差俩个差够一天,所以先算白天的 :当前
whour += ((we - date1Time) / bl) + ((date2Time - wb) / bl);
bhour += b;
//开始小于等于21 并且结束大于7点说明有白天时间段
if (date1Time <= we && date2Time > wb) {
wcs += 1;
}
bcs += 1;
}
}
//2.开始不正常 结束正常
if (date2Time >= wb && date2Time <= we) {
if (date1Time > we || date1Time < wb) {
if (date1Time > we) { //开始 > 21
//21 13
//先计算今天的黑夜再加上7个小时
long l = zero - date1Time;
long hou = l / bl;
bhour += hou + 7;
bcs += 1;
} else if (date1Time < wb) {
//5
// 先算离白天7点的黑夜小时
bhour += (wb - date1Time) / bl;
bcs += 1;
}
//结束正常,算超出的小时数
whour += (date2Time - wb) / bl>1?(date2Time - wb) / bl:1;
//判断当天开始时间超过白天段再让加一
if (date1Time < we && date1Time >= wb && date2Time <= zero
//开始小于21,并且结束大于7小于21说明有白天时间段
|| date1Time < we && date2Time < zero && date2Time > wb) {
wcs += 1;
}
}
}
//3.开始不正常 结束不正常 都小于7 都大于21
if (date1Time < wb && date2Time < wb ||
date1Time > we && date2Time > we) {
if (date2Time > date1Time) { //结束 >开始
//4 3
//23 22
//相当于一天多了俩个时间的差的小时,并且是黑夜
bhour += (date2Time - date1Time) / bl;
bcs += 1;
} else if (date2Time < date1Time) { // 结束 <开始
//6 4
//先计算 离7点的黑夜数
bhour += (wb - date1Time) / bl + date2Time / bl + 3;
//差俩个时间差为一整天,所以白天都有
whour += w;
wcs += 1;
bcs += 1;
}
}
//4.开始正常 结束不正常 小于7 大于21
if (date1Time >= wb && date1Time <= we) {
if (date2Time < wb || date2Time > we) {
if (date2Time < wb) { //结束 < 7
//14 6
//先结算正常白天的小时数,黑夜=加上到24的3个小时+结束的黑夜小时数
bhour += 3 + date2Time / bl;
bcs += 1;
} else if (date2Time > we) {//结束 >21
//14 22
//他大于21 进入黑夜 黑夜数等于超出的小时数
bhour += (date2Time - we) / bl;
bcs += 1;
}
whour += (we - date1Time) / bl>1?(we - date1Time) / bl:1;
//判断当天开始时间超过白天段再让加一
if (date1Time < we && date1Time >= wb && date2Time <= zero
//只有开始小于21才有白天段
|| date1Time < we && date2Time < zero && date2Time > wb) {
wcs += 1;
}
}
}
//5.开始不正常 结束不正常
if (date1Time < wb && date2Time > we
|| date1Time > we && date2Time < wb) {
if (date1Time < wb && date2Time > we) { // 6 23
//先计算黑夜,到7点的黑夜+结束超出的小时数
bhour += (wb - date1Time) / bl + (date2Time - we) / bl;
whour += w;
wcs += 1;
bcs += 1;
}
if (date1Time > we && date2Time < wb) {// 23 6
//先结算今天到凌晨的黑夜数+明天的黑夜数
bhour += (zero - date1Time) / bl + date2Time / bl;
bcs += 1;
}
}
//判断分钟是否是00,当前是不是整点,多一秒就按一个小时算
if (date1Time % bl != 0) {
whour += 1;
hour+=1;
}
if (date2Time % bl != 0) {
bhour += 1;
hour+=1;
}
}
System.out.println("总天数:" + day);
System.out.println("总小时数:" + hour + "\n");
System.out.println("白天小时数:" + whour);
System.out.println("黑夜小时数:" + bhour + "\n");
System.out.println("白天次数:" + wcs);
System.out.println("夜晚次数:" + bcs);
}
}