Unterschied zwischen zwei Daten in Java

Unterschied zwischen zwei Daten in Java

1. Überblick

In diesem kurzen Artikel werden wir verschiedene Möglichkeiten untersuchen, um die Differenz zwischen zwei Daten in Java zu berechnen.

Weitere Lektüre:

Inkrementierungsdatum in Java

Eine Übersicht über verschiedene Kern- und Drittanbieter-Methoden zum Hinzufügen von Tagen zu einem Datum

Read more

Überprüfen Sie, ob eine Zeichenfolge ein gültiges Datum in Java ist

Sehen Sie sich verschiedene Möglichkeiten an, um zu überprüfen, ob ein String in Java ein gültiges Datum ist

Read more

2. Kern Java

2.1. Verwenden vonjava.util.Date, um den Unterschied in Tagen zu ermitteln

Beginnen wir mit der Verwendung der Java-Kern-APIs, um die Berechnung durchzuführen und die Anzahl der Tage zwischen den beiden Daten zu bestimmen:

@Test
public void givenTwoDatesBeforeJava8_whenDifferentiating_thenWeGetSix()
  throws ParseException {

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH);
    Date firstDate = sdf.parse("06/24/2017");
    Date secondDate = sdf.parse("06/30/2017");

    long diffInMillies = Math.abs(secondDate.getTime() - firstDate.getTime());
    long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);

    assertEquals(diff, 6);
}

2.2. Verwenden vonjava.time - Seit Java 8

Die Berechnung der Differenz ist nun intuitiver, wenn wirLocalDate, LocalDateTime verwenden, um die beiden Daten (mit oder ohne Zeit) in Kombination mitPeriod undDuration: darzustellen

Die Differenz vonLocalDate:

@Test
public void givenTwoDatesInJava8_whenDifferentiating_thenWeGetSix() {
    LocalDate now = LocalDate.now();
    LocalDate sixDaysBehind = now.minusDays(6);

    Period period = Period.between(now, sixDaysBehind);
    int diff = period.getDays();

    assertEquals(diff, 6);
}

Der Fall vonLocalDateTime:

@Test
public void givenTwoDateTimesInJava8_whenDifferentiating_thenWeGetSix() {
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime sixMinutesBehind = now.minusMinutes(6);

    Duration duration = Duration.between(now, sixMinutesBehind);
    long diff = Math.abs(duration.toMinutes());

    assertEquals(diff, 6);
}

Hereist etwas detaillierter zu dieser API.

2.3. Verwenden vonjava.time.temporal.ChronoUnit, um den Unterschied in Sekunden zu ermitteln

Die Zeit-API in Java 8 repräsentiert eine Einheit von Datum und Uhrzeit, z. Sekunden oder Tage mitTemporalUnit -Sinterschnittstelle. Each unit provides an implementation for a method named between to calculate the amount of time between two temporal objects in terms of that specific unit.

Zum Beispiel, um die Sekunden zwischen zweiLocalDateTimes zu berechnen:

@Test
public void givenTwoDateTimesInJava8_whenDifferentiatingInSeconds_thenWeGetTen() {
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime tenSecondsLater = now.plusSeconds(10);

    long diff = ChronoUnit.SECONDS.between(now, tenSecondsLater);

    assertEquals(diff, 10);
}

ChronoUnit stellt eine Reihe konkreter Zeiteinheiten bereit, indem die SchnittstelleTemporalUnit implementiert wird. It’s highly recommended to static import the ChronoUnit enum values to achieve more readability:

import static java.time.temporal.ChronoUnit.SECONDS;

// omitted
long diff = SECONDS.between(now, tenSecondsLater);

Wir können auch zwei beliebige kompatible zeitliche Objekte an diebetween -Smethod übergeben, sogar dieZonedDateTime.

Was anZonedDateTime großartig ist, ist, dass die Berechnung auch dann funktioniert, wenn sie auf unterschiedliche Zeitzonen eingestellt sind:

@Test
public void givenTwoZonedDateTimesInJava8_whenDifferentiating_thenWeGetSix() {
    LocalDateTime ldt = LocalDateTime.now();
    ZonedDateTime now = ldt.atZone(ZoneId.of("America/Montreal"));
    ZonedDateTime sixMinutesBehind = now
      .withZoneSameInstant(ZoneId.of("Asia/Singapore"))
      .minusMinutes(6);

    long diff = ChronoUnit.MINUTES.between(sixMinutesBehind, now);

    assertEquals(diff, 6);
}

2.4. Verwenden vonjava.time.temporal.Temporaluntil()

JedesTemporal-Objekt, z. LocalDate or ZonedDateTime, provides an until method to calculate the amount of time until another temporal in terms of the specified unit:

@Test
public void givenTwoDateTimesInJava8_whenDifferentiatingInSecondsUsingUntil_thenWeGetTen() {
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime tenSecondsLater = now.plusSeconds(10);

    long diff = now.until(tenSecondsLater, ChronoUnit.SECONDS);

    assertEquals(diff, 10);
}

DieTemporal#until undTemporalUnit#between ind zwei verschiedene APIs für dieselbe Funktionalität.

3. Externe Bibliotheken

3.1. JodaTime

Wir können auch eine relativ einfache Implementierung mitJodaTime durchführen:


    joda-time
    joda-time
    2.9.9

Sie können die neueste Version vonJoda-time von Maven Central erhalten.

LocalDate Fall:

@Test
public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() {
    LocalDate now = LocalDate.now();
    LocalDate sixDaysBehind = now.minusDays(6);

    Period period = new Period(now, sixDaysBehind);
    long diff = Math.abs(period.getDays());

    assertEquals(diff, 6);
}

In ähnlicher Weise ist es mitLocalDateTime:

@Test
public void givenTwoDateTimesInJodaTime_whenDifferentiating_thenWeGetSix() {
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime sixMinutesBehind = now.minusMinutes(6);

    Period period = new Period(now, sixMinutesBehind);
    long diff = Math.abs(period.getDays());
}

3.2. Date4J

Date4j bietet auch eine einfache Implementierung, ohne den Hinweis, dass wir in diesem Fall explizit einTimeZone. angeben müssen

Beginnen wir mit der Maven-Abhängigkeit:


    com.darwinsys
    hirondelle-date4j
    1.5.1

Hier ist ein kurzer Test mit den StandardDateTime:

@Test
public void givenTwoDatesInDate4j_whenDifferentiating_thenWeGetSix() {
    DateTime now = DateTime.now(TimeZone.getDefault());
    DateTime sixDaysBehind = now.minusDays(6);

    long diff = Math.abs(now.numDaysFrom(sixDaysBehind));

    assertEquals(diff, 6);
}

4. Fazit

In diesem Tutorial haben wir einige Methoden zur Berechnung der Differenz zwischen Datumsangaben (mit und ohne Zeitangabe) gezeigt, sowohl in Java als auch unter Verwendung externer Bibliotheken.

Der vollständige Quellcode des Artikels ist inover on GitHub verfügbar.