Java日期差异程序
在这篇文章中,我们将了解如何根据年,月,日和小时,分钟,秒来计算Java中的日期和时间差。
要计算Java中两个日期之间的时差,我们可以使用SimpleDateFormat类,尽管该类涉及大量的手动计算,并且不考虑时区和日光节约。
为了减轻这些缺点,Java 8中增加了新的Date and Time API,该类提供了使用内置方法来计算日期和时间差的类,并且在计算时差时还考虑了时区,夏时制和and年。
目录
使用SimpleDateFormat的两个日期之间的差异
使用Java 8类的两个日期之间的差异
使用Period类的两个日期之间的年,月,日之间的差异
使用Duration类以天,小时,分钟,秒为单位的两个日期之间的时差
同时使用Period和Duration类来计算日期差
使用ChronoUnit找出差异
使用SimpleDateFormat的两个日期之间的差异
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.TimeUnit; public class DifferenceDate { public static void main(String[] args) { try { dateDiff("15/08/2019 09:10:05", "04/09/2019 14:22:15", "dd/MM/yyyy HH:mm:ss"); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static void dateDiff(String date1, String date2, String pattern) throws ParseException{ SimpleDateFormat sdf = new SimpleDateFormat(pattern); Date d1 = sdf.parse(date1); Date d2 = sdf.parse(date2); long diffInMillis = d2.getTime() - d1.getTime(); long daysDiff = TimeUnit.DAYS.convert(diffInMillis, TimeUnit.MILLISECONDS); long hoursDiff = TimeUnit.HOURS.convert(diffInMillis - (daysDiff * 24 * 60 * 60 * 1000), TimeUnit.MILLISECONDS); long minutesDiff = TimeUnit.MINUTES.convert(diffInMillis - (daysDiff * 24 * 60 * 60 * 1000) - (hoursDiff * 60 * 60 * 1000), TimeUnit.MILLISECONDS); long secondsDiff = TimeUnit.SECONDS.convert(diffInMillis - (daysDiff * 24 * 60 * 60 * 1000) - (hoursDiff * 60 * 60 * 1000) - (minutesDiff * 60 * 1000), TimeUnit.MILLISECONDS); System.out.println(daysDiff + " day(s) " + hoursDiff + " Hour(s) " + minutesDiff + " Minute(s) " + secondsDiff + " Second(s)"); } }
输出:
20 day(s) 5 Hour(s) 12 Minute(s) 10 Second(s)
如我们所见,使用SimpleDateFormat需要大量的人工工作,我们需要按照所需的时间单位进行转换。
使用Java 8类的两个日期之间的差异
在Java 8中新的日期和时间API中,可以使用以下类进行日期差计算。
java.time.Period –基于日期的时间量,周期的支持单位是YEARS,MONTHS和DAYS。
java.time.Duration-基于时间的时间量。此类以秒和纳秒为单位对时间量或者时间量进行建模。可以使用其他基于持续时间的单位(例如分钟和小时)来访问它。
java.time.temporal.TemporalUnit-TemporalUnit是一个表示日期时间单位的接口,例如Days或者Hours。
java.time.temporal.ChronoUnit –它是实现TemporalUnit接口的枚举。
两个日期之间以年,月,日为单位的差异
可以使用Period类来计算基于日期的时间中两个日期之间的差异。
import java.time.LocalDate; import java.time.Period; public class DifferenceDate { public static void main(String[] args) { LocalDate date1 = LocalDate.of(2018, 8, 15); LocalDate date2 = LocalDate.of(2019, 9, 4); dateDiff(date1, date2); } private static void dateDiff(LocalDate date1, LocalDate date2){ Period p = Period.between(date1, date2); System.out.printf("%d Year(s) %d Month(s) %d Day(s)", p.getYears(), p.getMonths(), p.getDays()); } }
输出:
1 Year(s) 0 Month(s) 20 Day(s)
两个日期之间的时差,以天,小时,分钟,秒为单位
可以使用Duration类来计算基于时间的两个日期之间的时差。
public class DifferenceDate { public static void main(String[] args) { LocalDateTime date1 = LocalDateTime.of(2019, 9, 3, 9, 10, 5); LocalDateTime date2 = LocalDateTime.of(2019, 9, 4, 14, 22, 15); dateDiff(date1, date2); } private static void dateDiff(LocalDateTime date1, LocalDateTime date2){ Duration d = Duration.between(date1, date2); System.out.printf("%d Day(s) %d Hour(s) %d Minute(s) %d Second(s)", d.toDays(), d.toHoursPart(), d.toMinutesPart(), d.toSecondsPart()); } }
输出:
1 Day(s) 5 Hour(s) 12 Minute(s) 10 Second(s)
同时使用Period和Duration类来计算日期差
import java.time.Duration; import java.time.LocalDateTime; import java.time.Period; public class DifferenceDate { public static void main(String[] args) { LocalDateTime date1 = LocalDateTime.of(2018, 7, 2, 12, 18, 13); LocalDateTime date2 = LocalDateTime.of(2019, 9, 4, 14, 22, 15); dateDiff(date1, date2); } private static void dateDiff(LocalDateTime date1, LocalDateTime date2){ Period p = Period.between(date1.toLocalDate(), date2.toLocalDate()); Duration d = Duration.between(date1, date2); System.out.printf("%d Year(s) %d Month(s) %d Day(s) %d Hour(s) %d Minute(s) %d Second(s)", p.getYears(), p.getMonths(), p.getDays(), d.toHoursPart(), d.toMinutesPart(), d.toSecondsPart()); } }
输出:
1 Year(s) 2 Month(s) 2 Day(s) 2 Hour(s) 4 Minute(s) 2 Second(s)
使用ChronoUnit找出差异
如果我们想要单位的总差异,那么也可以使用ChronoUnit。
public class DifferenceDate { public static void main(String[] args) { LocalDateTime date1 = LocalDateTime.of(2019, 9, 3, 9, 10, 5); LocalDateTime date2 = LocalDateTime.of(2019, 9, 4, 14, 22, 15); dateDiff(date1, date2); } private static void dateDiff(LocalDateTime date1, LocalDateTime date2){ long daysDiff = ChronoUnit.DAYS.between(date1, date2); long hoursDiff = ChronoUnit.HOURS.between(date1, date2); long minutesDiff = ChronoUnit.MINUTES.between(date1, date2); long secondsDiff = ChronoUnit.SECONDS.between(date1, date2); long millisDiff = ChronoUnit.MILLIS.between(date1, date2); long nanoDiff = ChronoUnit.NANOS.between(date1, date2); System.out.println("Days- "+ daysDiff); System.out.println("Hours- "+ hoursDiff); System.out.println("Minutes- "+ minutesDiff); System.out.println("Seconds- "+ secondsDiff); System.out.println("Millis- "+ millisDiff); System.out.println("Nano Seconds- "+ nanoDiff); } }
输出:
Days- 1 Hours- 29 Minutes- 1752 Seconds- 105130 Millis- 105130000 Nano Seconds- 105130000000000