java 计算有效时长,有一时间段不计算时长
计算 2020-08-07 10:10:23 到 2020-08-08 22:10:23 时间段内有多少小时,每天的01:00:00至06:00:00不计时长
计算时效性
同一天内有6种情况,分别是
00:00:00[s][e]01:00:00;
00:00:00[s]01:00:00 AND 01:00:00[e]06:00:00
00:00:00[s]01:00:00 AND 06:00:00[e]23:59:59
01:00:00[s][e]06:00:00
01:00:00[s]06:00:00 AND 06:00:00[e]23:59:59
06:00:00[s][e]23:59:59
计算不同天,不同天分为两个同一天分别计算相加
1.第一天开始时间~ “23:59:59”
2."00:00:00"~最后一天的结束时间
计算不同天的天数减去1得到相隔周期,乘以周期值
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 累计时长计算 并且每天的01:00:00至06:00:00不计时长
*
* @author weixiaoshuai 2020-08-07 16:00:00
*
*/
public class wxsJS {
private static String start = "01:00:00";
private static String end = "06:00:00";
public static void main(String[] args) {
String startTime1 = "2020-08-07 10:10:23";
String endTime1 = "2020-08-08 22:10:23";
System.out.println("有效时长:"+new wxsJS().youxiaoshichangjisuan(startTime1, endTime1));// 有效时长H
}
public String youxiaoshichangjisuan(String startTime1, String endTime1) {
String s = " ";
DecimalFormat df1 = new DecimalFormat("0.00");
try {
Date startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(startTime1);
Date endTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(endTime1);
float shichang1 = (endTime.getTime() - startTime.getTime()) / 1000.0F / 60.0F;// 60.0F;
float shichang = 0;
String startTian = startTime1.split(" ")[0];
String endTian = endTime1.split(" ")[0];
Date t1 = new SimpleDateFormat("yyyy-MM-dd").parse(startTian);
Date t2 = new SimpleDateFormat("yyyy-MM-dd").parse(endTian);
int t = (int) ((t2.getTime() - t1.getTime()) / 1000.0F / 60.0F / 60.0F / 24.0F);
String startHms = startTime1.split(" ")[1];
String endHms = endTime1.split(" ")[1];
if (t == 0) {// 同一天的时间 endHmsD 永远大于 startHmsD
// 00:00:00~[s][e]~01:00:00 or
// 00:00:00~[s]~01:00:00 or
// 06:00:00~[e]~23:59:59 or
// 06:00:00~[s][e]~23:59:59
shichang = cs(startHms, endHms);
} else {// 不同一天的时间 endHmsD 永远大于 startHmsD
// 00:00:00~[e]~01:00:00 or
// 00:00:00~[s][e]~01:00:00 or
// 00:00:00~[s]~01:00:00 or
// 06:00:00~[e]~23:59:59 or
// 06:00:00~[s][e]~23:59:59 or
// 06:00:00~[s]~23:59:59
float shichangone = cs(startHms, "23:59:59");
float shichangtow = cs("00:00:00", endHms);
shichang = shichangone + shichangtow + ((t - 1) * 19);
}
s = df1.format(shichang);
System.err.println(t + "告警开始时间:" + startTime1 + " - " + endTime1 + " -- " + shichang1 + " --- " + shichang);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return s;
}
private static float cs(String startHms, String endHms) throws ParseException {
float shichang = 0;
Date startHmsD = new SimpleDateFormat("HH:mm:ss").parse(startHms);
Date endHmsD = new SimpleDateFormat("HH:mm:ss").parse(endHms);
Date duan1 = new SimpleDateFormat("HH:mm:ss").parse("00:00:00");
Date duan2 = new SimpleDateFormat("HH:mm:ss").parse(start);
Date duan3 = new SimpleDateFormat("HH:mm:ss").parse(end);
Date duan4 = new SimpleDateFormat("HH:mm:ss").parse("23:59:59");
if (startHmsD.getTime() >= duan1.getTime() && startHmsD.getTime() <= duan2.getTime()
&& endHmsD.getTime() >= duan1.getTime() && endHmsD.getTime() <= duan2.getTime()) {
// 00:00:00~[s][e]~01:00:00
shichang = shichang + (endHmsD.getTime() - startHmsD.getTime()) / 1000.0F / 60.0F / 60.0F;
}
if (startHmsD.getTime() >= duan1.getTime() && startHmsD.getTime() <= duan2.getTime()
&& endHmsD.getTime() >= duan2.getTime() && endHmsD.getTime() <= duan3.getTime()) {
// 00:00:00~[s]~01:00:00
// AND
// 01:00:00~[e]~06:00:00
shichang = shichang + (duan2.getTime() - startHmsD.getTime()) / 1000.0F / 60.0F / 60.0F;
}
if (startHmsD.getTime() >= duan1.getTime() && startHmsD.getTime() <= duan2.getTime()
&& endHmsD.getTime() >= duan3.getTime() && endHmsD.getTime() <= duan4.getTime()) {
// 00:00:00~[s]~01:00:00
// AND
// 06:00:00~[e]~23:59:59
shichang = shichang + (duan2.getTime() - startHmsD.getTime()) / 1000.0F / 60.0F / 60.0F
+ (endHmsD.getTime() - duan3.getTime()) / 1000.0F / 60.0F / 60.0F;
}
if (startHmsD.getTime() >= duan2.getTime() && startHmsD.getTime() <= duan3.getTime()
&& endHmsD.getTime() >= duan2.getTime() && endHmsD.getTime() <= duan3.getTime()) {
// 01:00:00~[s][e]~06:00:00
shichang = 0;
}
if (startHmsD.getTime() >= duan2.getTime() && startHmsD.getTime() <= duan3.getTime()
&& endHmsD.getTime() >= duan3.getTime() && endHmsD.getTime() <= duan4.getTime()) {
// 01:00:00~[s]~06:00:00
// AND
// 06:00:00~[e]~23:59:59
shichang = shichang + (endHmsD.getTime() - duan3.getTime()) / 1000.0F / 60.0F / 60.0F;
}
if (startHmsD.getTime() >= duan3.getTime() && startHmsD.getTime() <= duan4.getTime()
&& endHmsD.getTime() >= duan3.getTime() && endHmsD.getTime() <= duan4.getTime()) {
// 06:00:00~[s][e]~23:59:59
shichang = shichang + (endHmsD.getTime() - startHmsD.getTime()) / 1000.0F / 60.0F / 60.0F;
}
return shichang;
}
}