当前位置: 首页 > news >正文

LocalDateTime节日和平日在时间占比计算方法

LocalDateTime节日和平日在时间占比计算方法

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);}
}

 

http://www.wxhsa.cn/company.asp?id=5500

相关文章:

  • JSON字符串转换List对象列表 JSONArray toJavaList
  • vue3 使用 docx-preview 预览 Word文档
  • 数据库原理-第三章——SQL
  • 啥是CPU
  • C# Avalonia 15- Animation- CodeAnimation
  • ubuntu 18.04安装mysql 8.0.41
  • Topaz Photo AI Pro 4.0.4 AI图片智能降噪(win版)
  • 阿里云基础设施 AI Tech Day AI 原生,智构未来——AI 原生架构与企业实践专场
  • 实用指南:LINUX910 CENTOS8 新建虚拟机;重设root密码/时间同步
  • 零基础学习PYthon记录
  • C++ std::unordered_set
  • 如何将一个项目同时提交到GitHub和Gitee(码云)上
  • 基于Matlab的LeNet-5车牌字符识别系统实现
  • MATLAB的交通标志牌识别实现
  • Python常见的数据结构和代码示例
  • Grafana 中文入门教程 | 构建你的第一个仪表盘
  • Gitee DevOps:中国开发者效率革命的数字引擎
  • Topaz Photo AI Pro 4.0.4 AI图片智能降噪
  • C++ std::map
  • 易基因:Nat Genet/IF29:董朝斌团队ChIP-seq等揭示作物株型穗型发育调控新机制 助力表观遗传育种驯化改良(顶刊佳作)
  • Edge浏览器网页长截图
  • Python TensorFlow的CNN-LSTM-GRU集成模型在边缘物联网数据IoT电动汽车充电站入侵检测应用
  • C++多线程编程—线程控制、同步与互斥详解
  • MySQL启动失败:mysqld.log Permis 报错处理.250916
  • 源码管理—密钥硬编码问题
  • 无速度传感器交流电机的扩展Luenberger观测器
  • AI Ping体验记:终于有人做大模型服务的“性能监控”了
  • 数据库原理-第二章——关系型数据库
  • mac 的任务栏 Windows-Style Taskbar For macOS
  • 快手Java一面