LocalDateTime节日和平日在时间占比计算方法
需求背景: 假设 2025-4-4 ~ 2025-4-6 是节假日 计算某个时间段在节假日中的占比,保留小数点后4位
LocalDate now = LocalDate.of(2025,05,22);
LocalDate ld = now.minusDays(18);
System.out.println("ld="+ ld); //ld=2025-05-04
LocalDate now2 = LocalDate.of(2025,07,03);
LocalDate ld2 = now2.minusDays(30);
System.out.println("ld2="+ ld2); //ld2=2025-06-03
LocalDate ll = LocalDate.of(2025,06,03);
LocalTime tt = LocalTime.of(11,56,55);
LocalDateTime ldt = ll.atTime(tt);
基础版本
package com.example.core.mydemo.java3.jsonDemo;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class HolidayTimeCalculator {
public static void main(String[] args) {
// 定义节假日时间范围 - 清明节
LocalDateTime holidayStart = LocalDateTime.of(2025, 4, 4, 0, 0);
LocalDateTime holidayEnd = LocalDateTime.of(2025, 4, 6, 23, 59, 59);
// 需要计算的时间点
LocalDateTime time1 = LocalDateTime.of(2025, 4, 6, 21, 30);
LocalDateTime time2 = LocalDateTime.of(2025, 4, 7, 21, 30);
// 计算平日时间占比(假设平日为24小时)
long totalWeekdaySeconds = 24 * 60 * 60;
// 设置4位小数格式
DecimalFormat df = new DecimalFormat("0.0000");
// 计算时间点在节假日中的占比
if (time1.isAfter(holidayStart) && time1.isBefore(holidayEnd)) {
long holidaySeconds = ChronoUnit.SECONDS.between(time1,holidayEnd);
double holidayRatio = (double) holidaySeconds / totalWeekdaySeconds;
System.out.printf("2025-04-06 21:30:00占节假日时间的" + df.format(holidayRatio) + "\n");
}
long weekdaySeconds = time2.getHour() * 3600 + time2.getMinute() * 60;
double weekdayRatio = (double) weekdaySeconds / totalWeekdaySeconds;
System.out.printf("2025-04-07 21:30:00占平日时间的"+ df.format(weekdayRatio));
}
}
升级版本
package com.example.core.mydemo.java3.jsonDemo;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
public class HolidayTimeCalculator2 {
public static void main(String[] args) {
// BigDecimal bigDecimal = new BigDecimal("200.1234");
// System.out.println(bigDecimal.toString()); //200.1234
// 需要计算的时间点
LocalDateTime time1 = LocalDateTime.of(2025, 4, 3, 21, 30);
LocalDateTime time2 = LocalDateTime.of(2025, 4, 4, 21, 30);
// 定义节假日时间范围
// LocalDateTime holidayStart = LocalDateTime.of(2025, 4, 4, 0, 0);
// LocalDateTime holidayEnd = LocalDateTime.of(2025, 4, 6, 23, 59, 59);
LocalDateTime holidayStart = null;
LocalDateTime holidayEnd = null;
extracted(time1, time2, holidayStart, holidayEnd);
}
private static void extracted(LocalDateTime time1, LocalDateTime time2, LocalDateTime holidayStart, LocalDateTime holidayEnd) {
// 计算平日时间占比(假设平日为24小时)
long totalWeekdaySeconds = 24 * 60 * 60;
// 设置4位小数格式
DecimalFormat df = new DecimalFormat("0.0000");
BigDecimal holiday = new BigDecimal(0);
BigDecimal common = new BigDecimal(0);
//判断是否包含节假日
//全部节假日
//开始节假期,结束平日
//开始平日,结束是节假日
//全部是平日
if(holidayStart != null && (time1.isAfter(holidayStart) || time1.isEqual(holidayStart)) && (time2.isBefore(holidayEnd) || time2.isEqual(holidayEnd))){
long holidaySeconds = ChronoUnit.SECONDS.between(time1, time2);
double holidayRatio = (double) holidaySeconds / totalWeekdaySeconds;
BigDecimal add = new BigDecimal(df.format(holidayRatio));
holiday = holiday.add(add);
}else if(holidayStart != null && (time1.isAfter(holidayStart) || time1.isEqual(holidayStart)) && (time1.isBefore(holidayEnd) || time1.isEqual(holidayEnd))){
long holidaySeconds = ChronoUnit.SECONDS.between(time1, holidayEnd);
double holidayRatio = (double) holidaySeconds / totalWeekdaySeconds;
BigDecimal add = new BigDecimal(df.format(holidayRatio));
holiday = holiday.add(add);
long weekdaySeconds = ChronoUnit.SECONDS.between(holidayEnd, time2);
double weekdayRatio = (double) weekdaySeconds / totalWeekdaySeconds;
BigDecimal add2 = new BigDecimal(df.format(weekdayRatio));
common = common.add(add2);
}else if(holidayStart != null && (time2.isAfter(holidayStart) || time2.isEqual(holidayStart)) && (time2.isBefore(holidayEnd) || time2.isEqual(holidayEnd))){
long holidaySeconds = ChronoUnit.SECONDS.between(holidayStart, time2);
double holidayRatio = (double) holidaySeconds / totalWeekdaySeconds;
BigDecimal add = new BigDecimal(df.format(holidayRatio));
holiday = holiday.add(add);
long weekdaySeconds = ChronoUnit.SECONDS.between(time1, holidayStart);
double weekdayRatio = (double) weekdaySeconds / totalWeekdaySeconds;
BigDecimal add2 = new BigDecimal(df.format(weekdayRatio));
common = common.add(add2);
}else if(holidayStart == null || time2.isBefore(holidayStart) || time1.isAfter(holidayEnd)){
//不含节假日的参数,则默认都是平日
long weekdaySeconds = ChronoUnit.SECONDS.between(time1, time2);
double weekdayRatio = (double) weekdaySeconds / totalWeekdaySeconds;
BigDecimal add = new BigDecimal(df.format(weekdayRatio));
common = common.add(add);
}
System.out.println("holiday=" + holiday);
System.out.println("common=" + common);
}
}