依照需求,根据基础代码可进行调整。主要逻辑:按照开始时间排序时间段,而后遍历所有时间段。 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是因为包括开始和结束日期 } }
JAVA未知时间段,计算自然年占用天数
最新推荐文章于 2025-05-14 21:45:37 发布