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

Java 根据多个 MM-dd 日期计算总时长(包含当日和次日)

下面我将介绍如何根据多个"MM-dd"格式的日期(可能跨年)来计算总时长,特别处理当日和次日的情况。


解决方案

方法思路

  1. 将输入的"MM-dd"格式转换为完整的日期(考虑跨年情况)

  2. 对日期进行排序

  3. 计算相邻日期之间的时间差

  4. 累加得到总时长


运行代码

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.util.*;public class DateDurationCalculator {// 主计算方法public static Duration calculateTotalDuration(List<String> monthDayStrings, LocalDate today) {if (monthDayStrings == null || monthDayStrings.isEmpty()) {return Duration.ZERO;}// 转换所有日期为LocalDate(处理跨年)List<LocalDate> dates = convertMonthDayToDates(monthDayStrings, today);// 对日期进行排序Collections.sort(dates);// 计算总时长Duration totalDuration = Duration.ZERO;for (int i = 0; i < dates.size() - 1; i++) {LocalDate start = dates.get(i);LocalDate end = dates.get(i + 1);// 计算两个日期之间的天数long daysBetween = ChronoUnit.DAYS.between(start, end);// 如果日期连续(当日和次日)if (daysBetween == 1) {totalDuration = totalDuration.plus(Duration.ofDays(1));} else {// 非连续日期,只计算单个日期totalDuration = totalDuration.plus(Duration.ofDays(1));}}// 加上最后一个日期return totalDuration.plus(Duration.ofDays(1));}// 将MM-dd转换为LocalDate,处理跨年情况private static List<LocalDate> convertMonthDayToDates(List<String> monthDayStrings, LocalDate today) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd");List<LocalDate> dates = new ArrayList<>();for (String monthDay : monthDayStrings) {MonthDay md = MonthDay.parse(monthDay, formatter);// 获取可能的年份(今年或明年)LocalDate date = md.atYear(today.getYear());if (date.isBefore(today)) {// 如果日期已经过去,则认为是明年date = md.atYear(today.getYear() + 1);}dates.add(date);}return dates;}public static void main(String[] args) {// 示例使用LocalDate today = LocalDate.now();List<String> dates = Arrays.asList("12-25", "12-26", "01-01", "01-02");Duration duration = calculateTotalDuration(dates, today);System.out.println("总天数: " + duration.toDays());System.out.println("总小时数: " + duration.toHours());}
}

关键点说明

  1. 跨年处理:

    • 使用MonthDay类解析"MM-dd"格式

    • 比较日期与当前日期,决定使用今年还是明年的年份

  2. 当日和次日判断:

    • 使用ChronoUnit.DAYS.between()计算日期差

    • 差值为1表示是连续的当日和次日

  3. 总时长计算:

    • 连续日期计算为完整时间段

    • 非连续日期单独计算

  4. 输出结果:

    • 可以获取总天数、小时数等不同单位的时长


// 测试跨年情况
List<String> testDates1 = Arrays.asList("12-30", "12-31", "01-01");
Duration result1 = calculateTotalDuration(testDates1, LocalDate.of(2023, 1, 1));
// 应返回3天(12-30, 12-31, 01-01)// 测试非连续日期
List<String> testDates2 = Arrays.asList("01-01", "01-03", "01-05");
Duration result2 = calculateTotalDuration(testDates2, LocalDate.of(2023, 1, 1));
// 应返回3天(每个日期单独计算)

http://www.lryc.cn/news/606731.html

相关文章:

  • 新手小白如何快速检测IP 的好坏?
  • OSPF笔记整理
  • JavaWeb(苍穹外卖)--学习笔记16(定时任务工具Spring Task,Cron表达式)
  • 电子电气架构 --- 加速48V技术应用的平衡之道
  • SpringMVC的高级特性
  • mongodb中的哈希索引详解
  • Redis深度剖析:从基础到实战(下)
  • Unity3D数学第五篇:几何计算与常用算法(实用算法篇)
  • 【BFS】P7555 [USACO21OPEN] Maze Tac Toe S|普及+
  • 【C#学习Day16笔记】XML文件、 事件Event 、Json数据
  • JavaWeb--Student2025项目:条件查询、批量删除、新增、修改
  • 2025新征程杯全国54校园足球锦标赛在北京世园公园隆重开幕
  • Java 开发中的 DTO 模式:从理论到实践的完整指南
  • Java 大视界 -- Java 大数据机器学习模型在电商产品定价策略优化与市场竞争力提升中的应用(375)
  • 下次接好运~
  • 【苍穹外卖项目】Day05
  • PyTorch基础——张量计算
  • IO流-文件实例
  • 力扣-最大单词长度乘积
  • 鸿蒙智能居家养老系统构思(续二)—— 适老化烹饪中心详细构思
  • C#实现左侧折叠导航菜单
  • 思途JSP学习 0801
  • 退出python的base环境
  • 【常见分布及其特征(8)】连续型随机变量-正态分布*
  • JAVA结合AI
  • 高速公路桥梁安全监测系统解决方案
  • k8s云原生rook-ceph pvc快照与恢复(下)
  • 如何保护 Redis 实例的安全?
  • C++对象访问有访问权限是不是在ide里有效
  • 解决MySQL不能编译存储过程的问题