当前位置: 首页 > 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.dtcms.com/a/309816.html

相关文章:

  • python PIL图片转base64字符串
  • [极客大挑战 2019]RCE ME
  • RockAI 的破壁之战:Yan 架构如何啃下“端侧炼丹”硬骨头?
  • Vue3 setup、ref和reactive函数
  • 元策联盈:深耕金融领域,赋能行业发展​
  • 【Flutter3.8x】flutter从入门到实战基础教程(四):自定义实现一个自增的StatefulWidget组件
  • 磁力搜索+磁力下载!无需解释!直接上车!
  • 工作好用小工具积累
  • EGE 流量开关 LG 518 GSP P11237
  • 异步函数被调用多次,多次处理同一个文件导致占用,如何让异步函数按顺序执行?
  • 书生浦语第五期L0G2
  • 【音视频】WebRTC 中的RTP、RTCP、SDP、Candidate
  • Ubuntu-Server-24.04-LTS版本操作系统如何关闭自动更新,并移除不必要的内核
  • C++在类的构造函数中调用另一个构造函数
  • STM32CubeIDE新建项目过程记录备忘(四)EXTI外部中断
  • 网络编程-加密算法
  • Spring Boot 异步执行方式全解析:@Async、CompletableFuture 与 TaskExecutor 对比
  • 面试题:怎么理解 OSI 参考模型(开放式系统互联参考模型) 和 TCP/IP 模型(传输控制协议 / 网际协议模型 )
  • Node.js中Buffer的用法
  • Linux中Docker Swarm介绍和使用
  • 数据结构学习基础和从包装类缓存到泛型擦除的避坑指南
  • QT初入门-界面设置
  • Metamorph、LlamaFusion、MetaQuery论文解读
  • Linux的对称多处理(SMP)机制
  • embodied复现所需docker环境配置粗略流程
  • CentOS7下同步时间的几种方式(NTP 、Chrony和systemd-timesyncd)
  • 2025年08月01日Github流行趋势
  • 注解退散!纯XML打造MyBatis持久层的终极形态
  • OCR、文档解析工具合集
  • C++ 前缀和、双指针