Java根据MM-dd和HH:mm格式日期计算时长与大小比较
1.如何根据多个"MM-dd"格式的日期(可能跨年)来计算总时长
特别处理当日和次日的情况
解决方案
方法思路
- 将输入的"MM-dd"格式转换为完整的日期(考虑跨年情况)
- 对日期进行排序
- 计算相邻日期之间的时间差
- 累加得到总时长
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.输出结果:可以获取总天数、小时数等不同单位的时长
2.比较多个"MM-dd"格式的日期(月份-日期)大小
可以使用以下几种方法
只比较日期:
import java.time.MonthDay;
import java.time.format.DateTimeFormatter;
public class CompareTwoDates {
public static void main(String[] args) {
String date1 = "12-31";
String date2 = "01-01";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd");
MonthDay md1 = MonthDay.parse(date1, formatter);
MonthDay md2 = MonthDay.parse(date2, formatter);
int result = md1.compareTo(md2);
if (result < 0) {
System.out.println(date1 + " 早于 " + date2);
} else if (result > 0) {
System.out.println(date1 + " 晚于 " + date2);
} else {
System.out.println(date1 + " 等于 " + date2);
}
}
}比较日期并进行排序:
import java.time.MonthDay;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class MonthDayComparison {
public static void main(String[] args) {
List<String> dates = Arrays.asList("12-31", "01-01", "06-15", "03-22");
// 转换为MonthDay对象并排序
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd");
Collections.sort(dates, (a, b) -> {
MonthDay md1 = MonthDay.parse(a, formatter);
MonthDay md2 = MonthDay.parse(b, formatter);
return md1.compareTo(md2);
});
System.out.println("排序后的日期: " + dates);
// 输出: [01-01, 03-22, 06-15, 12-31]
}
}注意事项
- 跨年问题:MM-dd 格式不包含年份信息,比较时只考虑月日
- 格式一致性:确保所有日期使用相同的格式(如都使用"MM-dd"或"M-d")
- 性能考虑:对于大量日期,MonthDay 方法比字符串分割更高效
- 错误处理:实际应用中应添加格式验证和异常处理
最佳实践推荐
对于 Java 8 及以上版本,推荐使用 MonthDay 类进行比较,因为:
- 代码更简洁
- 内置日期有效性检查
- 提供丰富的日期操作方法
3.汇总多个"HH:mm"格式的时间点,计算它们的总时长
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
public class StreamTimeSum {
public static void main(String[] args) {
List<String> times = List.of("08:15", "01:30", "00:45");
Duration total = times.stream()
.map(t -> LocalTime.parse(t, DateTimeFormatter.ofPattern("HH:mm")))
.map(t -> Duration.ofHours(t.getHour()).plusMinutes(t.getMinute()))
.reduce(Duration.ZERO, Duration::plus);
System.out.printf("总时长: %d小时%d分钟%n",
total.toHours(),
total.toMinutes() % 60);
// 输出: 总时长: 10小时30分钟
}
}注意事项
- 格式验证:实际应用中应添加格式验证,确保输入都是有效的"HH:mm"格式
- 负数处理:如果业务需要处理负时间,需要额外逻辑
- 性能考虑:对于大量时间点,Stream API可能稍慢于传统循环
- 时间溢出:当总时长超过24小时,确保显示逻辑能正确处理
最佳实践推荐
对于现代Java项目,推荐使用方法一(Java 8 Duration类):
- 代码更简洁易读
- 内置时间计算功能
- 自动处理进位和溢出
- 提供丰富的转换和操作方法
4.比较多个"HH:mm"格式时间的大小
只比较时间:
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class TimeComparison {
public static void main(String[] args) {
List<String> times = Arrays.asList("08:15", "13:30", "09:45", "05:00");
// 转换为LocalTime对象并排序
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
Collections.sort(times, (a, b) -> {
LocalTime t1 = LocalTime.parse(a, formatter);
LocalTime t2 = LocalTime.parse(b, formatter);
return t1.compareTo(t2);
});
System.out.println("按时间排序: " + times);
// 输出: [05:00, 08:15, 09:45, 13:30]
}
}比较时间并进行排序:
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class CompareTwoTimes {
public static void main(String[] args) {
String time1 = "13:45";
String time2 = "09:30";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
LocalTime t1 = LocalTime.parse(time1, formatter);
LocalTime t2 = LocalTime.parse(time2, formatter);
int result = t1.compareTo(t2);
if (result < 0) {
System.out.println(time1 + " 早于 " + time2);
} else if (result > 0) {
System.out.println(time1 + " 晚于 " + time2);
} else {
System.out.println(time1 + " 等于 " + time2);
}
}
}找出最早最晚时间:
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
import java.util.List;
public class FindMinMaxTime {
public static void main(String[] args) {
List<String> times = Arrays.asList("08:15", "13:30", "09:45", "05:00");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
LocalTime min = LocalTime.MAX;
LocalTime max = LocalTime.MIN;
for (String timeStr : times) {
LocalTime time = LocalTime.parse(timeStr, formatter);
if (time.isBefore(min)) {
min = time;
}
if (time.isAfter(max)) {
max = time;
}
}
System.out.println("最早时间: " + min.format(formatter));
System.out.println("最晚时间: " + max.format(formatter));
}
}注意事项
- 格式一致性:确保所有时间字符串使用相同的格式
- 24小时制:这些方法都假设使用24小时制格式
- 错误处理:实际应用中应添加格式验证和异常处理
- 性能考虑:对于大量时间点,LocalTime方法比字符串分割更高效
最佳实践推荐
对于 Java 8 及以上版本,推荐使用方法一(使用LocalTime类):
- 代码更简洁易读
- 内置时间有效性检查
- 提供丰富的时间操作方法
到此这篇关于Java根据MM-dd和HH:mm格式日期计算时长与大小比较的文章就介绍到这了,更多相关Java时长计算与比较内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Map按单个或多个Value排序当Value相同时按Key排序
Map可以先按照value进行排序,然后按照key进行排序。 或者先按照key进行排序,然后按照value进行排序,这样操作都行,这篇文章主要介绍了Map按单个或多个Value排序,当Value相同时按Key排序,需要的朋友可以参考下2023-02-02
java中List<String>转字符串形式常用方法总结(非常全!)
这篇文章主要介绍了java中List<String>转字符串形式的相关资料,文中通过示例总结了五种字符串连接方法及进阶场景、性能优化与特殊字符处理技巧,需要的朋友可以参考下2025-05-05
SpringBoot 2.x 接入非标准SSE格式大模型流式响应的实战解决方案
本文介绍了在SpringBoot2.7.3环境中接入非标准SSE格式大模型流式响应的实战解决方案,通过自定义实现,解决了大模型返回数据格式不符合标准SSE规范的问题,关键步骤包括引入Gradle依赖、配置WebClient、处理粘包、格式兼容和双重过滤机制,感兴趣的朋友跟随小编一起看看吧2025-02-02


最新评论