java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java时长计算与比较

Java根据MM-dd和HH:mm格式日期计算时长与大小比较

作者:Full Stack Developme

这篇文章主要为大家详细介绍了Java如何根据MM-dd和HH:mm格式日期进行时长计算与大小比较,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下

1.如何根据多个"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.跨年处理

2.当日和次日判断

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]
    }
}

注意事项

最佳实践推荐

对于 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分钟
    }
}

注意事项

最佳实践推荐

对于现代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));
    }
}

注意事项

最佳实践推荐

对于 Java 8 及以上版本,推荐使用方法一(使用LocalTime类):

到此这篇关于Java根据MM-dd和HH:mm格式日期计算时长与大小比较的文章就介绍到这了,更多相关Java时长计算与比较内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文