首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LocalDateTime节日和平日在时间占比计算方法

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

作者头像
oktokeep
发布2025-09-17 08:21:45
发布2025-09-17 08:21:45
8800
代码可运行
举报
文章被收录于专栏:第三方工具第三方工具
运行总次数:0
代码可运行

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

需求背景: 假设 2025-4-4 ~ 2025-4-6 是节假日 计算某个时间段在节假日中的占比,保留小数点后4位

代码语言:javascript
代码运行次数:0
运行
复制
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);

基础版本

代码语言:javascript
代码运行次数:0
运行
复制
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));
    }
}

升级版本

代码语言:javascript
代码运行次数:0
运行
复制
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);


    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-09-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档