Java日期差异程序

时间:2020-01-09 10:35:32  来源:igfitidea点击:

在这篇文章中,我们将了解如何根据年,月,日和小时,分钟,秒来计算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