News:三分天注定,七分靠打拼,爱拼才会赢!致力打造专业IT博客。如果你对本博客有任何意见或建议请联系作者,邮箱:blog@caokuan.cn

Java 8 计算日期和时间差

逝水无痕 207 0 条

Java 8 中提供了一套新的日期处理类,也提供了新旧日期类的转换方法。本篇文章主要讲如何利用新的日期处理类来计算两个日期的差值,这在日常开发中使用的非常多。

date.jpg

计算年、月、日的差值

示例1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate d1 = LocalDate.parse("2000-02-01", formatter);
LocalDate d2 = LocalDate.parse("2019-03-18", formatter);

Period period = Period.between(d1, d2);
System.out.println("年:" + period.getYears());
System.out.println("月:" + period.getMonths());
System.out.println("日:" + period.getDays());

输出结果:

年:19
月:1
日:17

计算出生后经历了多少年、多少月、多少日的场景非常适合使用 Period 类,因为 Period 的年、月、日的差值是分别对应年的差值、月的差值和日的差值。

示例2:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate d1 = LocalDate.parse("2000-02-01", formatter);
LocalDate d2 = LocalDate.parse("2019-03-18", formatter);

System.out.println("年:" + ChronoUnit.YEARS.between(d1, d2));
System.out.println("月:" + ChronoUnit.MONTHS.between(d1, d2));
System.out.println("日:" + ChronoUnit.DAYS.between(d1, d2));

输出结果:

年:19
月:229
日:6985

使用 ChronoUnit 类的计算结果与 Period 不同,年、月、日的差值是各自单独计算的总差值。

Period 和 ChronoUnit 计算差值的方法最终利用的都是 LocalDate.until(...) 方法。

计算时、分、秒、毫秒等的差值

示例1:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime d1 = LocalDateTime.parse("2019-01-11 00:00:00", formatter);
LocalDateTime d2 = LocalDateTime.parse("2019-03-05 01:00:00", formatter);
Duration duration = Duration.between(d1, d2);

System.out.println("日:" + duration.toDays());
System.out.println("时:" + duration.toHours());
System.out.println("分:" + duration.toMinutes());
System.out.println("秒:" + duration.getSeconds());
System.out.println("毫秒:" + duration.toMillis());
System.out.println("纳秒:" + duration.toNanos());

输出结果:

日:53
时:1273
分:76380
秒:4582800
毫秒:4582800000
纳秒:4582800000000000

Duration 适合精细的时差计算场景。

示例2:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime d1 = LocalDateTime.parse("2019-01-11 00:00:00", formatter);
LocalDateTime d2 = LocalDateTime.parse("2019-03-05 01:00:00", formatter);

System.out.println("时:" + ChronoUnit.HOURS.between(d1, d2));
System.out.println("分:" + ChronoUnit.MINUTES.between(d1, d2));
System.out.println("秒:" + ChronoUnit.SECONDS.between(d1, d2));
System.out.println("毫秒:" + ChronoUnit.MILLIS.between(d1, d2));
System.out.println("微秒:" + ChronoUnit.MICROS.between(d1, d2));
System.out.println("纳秒:" + ChronoUnit.NANOS.between(d1, d2));

输出结果:

时:1273
分:76380
秒:4582800
毫秒:4582800000
微秒:4582800000000
纳秒:4582800000000000

ChronoUnit 类从功能上看更强大,既可以计算年、月、日的差值,也可以计算时、分、秒的差值。但是有一些需要注意的地方:在上面列举的例子中,在计算年、月、日的差值时参数既可以传 LocalDate 也可以传 LocalDateTime,但是在计算时、分、秒的差值时只能使用 LocalDateTime 类型的参数。

ChronoUnit 在计算时、分、秒的差值时利用的是 LocalDateTime.until(...) 方法。

发表我的评论
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址