Java计算日期时间差的工具类总结

本文介绍了如何使用Java的SimpleDateFormat、ChronoUnit、Duration、Calendar和Period类来计算两个日期之间的天数差,重点讲解了Period类在处理日期间隔上的优势。通过实际案例展示了每种方法的使用和测试结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1. 概述

2. 使用案例

2.1 SimpleDateFormat

2.2 ChronoUnit

2.3 Duration

2.4 Calendar

2.5 Period


1. 概述

最近需要通过Java计算两个日期相差的天数,查了一些资料总结了以下的几个方法。

 源码可以参考:springboot-test

从下面的测试结果来看,我比较倾向用Period。

2. 使用案例

2.1 SimpleDateFormat

1) 源码。

public static void calculateTimeDifferenceBySimpleDateFormat(String fromDate, String toDate) throws ParseException {
	SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
	/*天数差*/
	Date fromDate1 = simpleFormat.parse(fromDate);
	Date toDate1 = simpleFormat.parse(toDate);
	long from1 = fromDate1.getTime();
	long to1 = toDate1.getTime();
	int days = (int) ((to1 - from1) / (1000 * 60 * 60 * 24));
	System.out.println("两个时间之间的天数差为:" + days);

	/*小时差*/
	Date fromDate2 = simpleFormat.parse(fromDate);
	Date toDate2 = simpleFormat.parse(toDate);
	long from2 = fromDate2.getTime();
	long to2 = toDate2.getTime();
	int hours = (int) ((to2 - from2) / (1000 * 60 * 60));
	System.out.println("两个时间之间的小时差为:" + hours);

	/*分钟差*/
	Date fromDate3 = simpleFormat.parse(fromDate);
	Date toDate3 = simpleFormat.parse(toDate);
	long from3 = fromDate3.getTime();
	long to3 = toDate3.getTime();
	int minutes = (int) ((to3 - from3) / (1000 * 60));
	System.out.println("两个时间之间的分钟差为:" + minutes);
}
@Test
public void calculateTimeDifferenceBySimpleDateFormatTest() throws ParseException {
    DateUtil.calculateTimeDifferenceBySimpleDateFormat("2022-08-01 12:00", "2022-08-12 12:00");
}

2) 测试结果。

2.2 ChronoUnit

 1) 源码。

public static void calculateTimeDifferenceByChronoUnit() {
	LocalDate startDate = LocalDate.of(2020, Month.MAY, 9); // 2020/05/09
	System.out.println("开始时间:" + startDate);

	LocalDate endDate = LocalDate.of(2024, Month.JANUARY, 26); // 2024/01/26
	System.out.println("结束时间:" + endDate);

	long daysDiff = ChronoUnit.DAYS.between(startDate, endDate);
	System.out.println("两个时间之间的天数差为:" + daysDiff);
}
@Test
public void calculateTimeDifferenceByChronoUnitTest() {
	DateUtil.calculateTimeDifferenceByChronoUnit();
}

 2) 测试结果。

2.3 Duration

1) 源码。

public static void calculateTimeDifferenceByDuration(int seconds, int days) {
	Instant inst1 = Instant.now();
	System.out.println("当前的时间:" + inst1);
	Instant inst2 = inst1.plus(Duration.ofSeconds(seconds));     //当前时间+seconds秒后的时间
	System.out.println("当前时间+" + seconds + "秒后的时间:" + inst2);
	Instant inst3 = inst1.plus(Duration.ofDays(days));       //当前时间+days天后的时间
	System.out.println("当前时间+" + days + "天后的时间:" + inst3);

	System.out.println("以毫秒计的时间差:" + Duration.between(inst1, inst2).toMillis());
	System.out.println("以秒计的时间差:" + Duration.between(inst1, inst3).getSeconds());
}
@Test
public void calculateTimeDifferenceByDurationTest() {
	DateUtil.calculateTimeDifferenceByDuration(10, 10);
	System.out.println("--------------------");
	DateUtil.calculateTimeDifferenceByDuration(120, 120);
}

 2) 测试结果。

2.4 Calendar

1) 源码。

public static void calculateTimeDifferenceByCalendar(String strDate) throws ParseException {
	SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
	Date date = formatter.parse(strDate);

	Calendar c1 = Calendar.getInstance();
	Calendar c2 = Calendar.getInstance();
	c2.setTime(date);

	int year = c1.get(Calendar.YEAR);
	int oldYear = c2.get(Calendar.YEAR); // 当前日期

	System.out.println("传入的日期与今年的年份差为:" + (year - oldYear));
}
@Test
public void calculateTimeDifferenceByCalendarTest() throws ParseException {
	DateUtil.calculateTimeDifferenceByCalendar("2021/04/01");
}

2) 测试结果。

2.5 Period

 1) 源码。

public static void calculateTimeDifferenceByPeriod(int year, int month, int dayOfMonth) {
	LocalDate today = LocalDate.now();
	System.out.println("现在日期:" + today);
	LocalDate oldDate = LocalDate.of(year, Month.of(month), dayOfMonth);
	System.out.println("输入:" + oldDate);

	Period p = Period.between(oldDate, today);
	System.out.printf("输入的日期距离今天的时间差:%d 年 %d 个月 %d 天\n", p.getYears(), p.getMonths(), p.getDays());
}
@Test
public void calculateTimeDifferenceByPeriodTest() {
	DateUtil.calculateTimeDifferenceByPeriod(2022, 8, 1);
	System.out.println("--------------------");
	DateUtil.calculateTimeDifferenceByPeriod(2023, 8, 1);
}

 2) 测试结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值