JAVA未知时间段,计算自然年占用天数

依照需求,根据基础代码可进行调整。主要逻辑:按照开始时间排序时间段,而后遍历所有时间段。

import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.text.SimpleDateFormat;
import java.util.*;

@Data
class OrgAnalysisInfoV {
    private Integer orgId;
    private String orgName;
    private Byte orgStatus;

    @ApiModelProperty("租赁开始时间")
    @JSONField(format = "yyyy-MM-dd")
    private Date leaseStartTime;

    @ApiModelProperty("租赁结束时间")
    @JSONField(format = "yyyy-MM-dd")
    private Date leaseEndTime;
}

public class Main {
    public static void main(String[] args) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        List<OrgAnalysisInfoV> orgAnalysis = new ArrayList<>();

        // 示例数据
        orgAnalysis.add(createOrg(311, "十足", (byte) 1, "2024-03-21", "2024-04-30"));
        orgAnalysis.add(createOrg(356, "添加测试", (byte) 1, "2024-07-23", "2024-08-22"));
        orgAnalysis.add(createOrg(391, "测试客户", (byte) 1, "2024-08-01", "2025-12-31")); // 2025年数据
        orgAnalysis.add(createOrg(392, "测试", (byte) 1, "2024-07-23", "2024-08-22"));
        orgAnalysis.add(createOrg(394, "前哨曙光", (byte) 1, "2024-08-02", "2024-10-05"));
        orgAnalysis.add(createOrg(395, "测试企业超管", (byte) 1, "2024-08-01", "2026-12-31")); // 2026年数据
        orgAnalysis.add(createOrg(396, "橘子科技", (byte) 1, "2024-11-01", "2026-12-31")); // 2026年数据

        // 去重和合并时间逻辑
        List<OrgAnalysisInfoV> mergedList = mergeLeasePeriods(orgAnalysis, 2024);

        // 输出结果
        int totalDays = 0;
        for (OrgAnalysisInfoV org : mergedList) {
            long days = calculateDays(org.getLeaseStartTime(), org.getLeaseEndTime());
            totalDays += days;
            System.out.println("合并后的时间范围: " + sdf.format(org.getLeaseStartTime()) + " 到 " + sdf.format(org.getLeaseEndTime()) + ",包含天数: " + days);
        }

        System.out.println("总共包含的天数: " + totalDays);
    }

    private static OrgAnalysisInfoV createOrg(int id, String name, byte status, String start, String end) throws Exception {
        OrgAnalysisInfoV org = new OrgAnalysisInfoV();
        org.setOrgId(id);
        org.setOrgName(name);
        org.setOrgStatus(status);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        org.setLeaseStartTime(sdf.parse(start));
        org.setLeaseEndTime(sdf.parse(end));
        return org;
    }

    private static List<OrgAnalysisInfoV> mergeLeasePeriods(List<OrgAnalysisInfoV> orgAnalysis, int currentYear) {
        // 按开始时间排序
        orgAnalysis.sort(Comparator.comparing(OrgAnalysisInfoV::getLeaseStartTime));

        List<OrgAnalysisInfoV> mergedList = new ArrayList<>();
        OrgAnalysisInfoV current = null;

        for (OrgAnalysisInfoV org : orgAnalysis) {
            // 将结束时间限制在当前自然年
            Calendar calendar = Calendar.getInstance();
            calendar.set(currentYear, Calendar.DECEMBER, 31);
            Date currentYearEnd = calendar.getTime();

            // 如果结束时间超过当前自然年,调整为当前自然年结束时间
            if (org.getLeaseEndTime().after(currentYearEnd)) {
                org.setLeaseEndTime(currentYearEnd);
            }

            if (current == null) {
                current = org; // 初始化当前时间段
            } else {
                // 检查是否重叠
                if (org.getLeaseStartTime().compareTo(current.getLeaseEndTime()) <= 0) {
                    // 有重叠,合并时间段
                    current.setLeaseEndTime(org.getLeaseEndTime().after(current.getLeaseEndTime()) ? org.getLeaseEndTime() : current.getLeaseEndTime());
                } else {
                    // 无重叠,保存当前时间段并更新当前时间段
                    mergedList.add(current);
                    current = org;
                }
            }
        }
        // 添加最后一个时间段
        if (current != null) {
            mergedList.add(current);
        }

        return mergedList;
    }

    private static long calculateDays(Date start, Date end) {
        // 计算两个日期之间的天数
        long diff = end.getTime() - start.getTime();
        return (diff / (1000 * 60 * 60 * 24)) + 1; // 加1是因为包括开始和结束日期
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值