2014-11-18 11 views
108

Ich weiß, es gibt viele Fragen zu SO, wie zu bekommen, aber ich möchte und Beispiel mit neuen Java 8 Date API. Ich kenne auch JodaTime-Bibliothek, aber ich möchte einen Weg ohne externe Bibliotheken.Tage zwischen zwei Daten in Java berechnen 8

Funktion muss mit diesen Einschränkungen beklagen:

  1. Prevent Fehler von Datum Savetime
  2. Eingang sind zwei Date-Objekte (ohne Zeit, ich weiß Local, aber ich muss mit Datum Instanzen tun)
+2

So etwas wie [dies zum Beispiel] (http://stackoverflow.com/questions/25776787/java-simpledateformat-format-issue-with-yyyy/25777559#25777559)? – MadProgrammer

+0

@MadProgrammer Nicht wirklich - Dauer ist nicht die beste Lösung, um das zu tun ... – assylias

+0

@assylias Nun, es ist besser als das, was die OP hatte – MadProgrammer

Antwort

176

Wenn Sie logischer Kalendertag, verwenden DAYS.between() Methode von java.time.temporal.ChronoUnit:

LocalDate dateBefore; 
LocalDate dateAfter; 
long daysBetween = DAYS.between(dateBefore, dateAfter); 

Wenn Sie 24 Stunden Tage, (a Dauer) möchten, können Sie stattdessen die Duration-Klasse verwenden:

LocalDate today = LocalDate.now() 
LocalDate yesterday = today.minusDays(1); 
// Duration oneDay = Duration.between(today, yesterday); // throws an exception 
Duration.between(today.atStartOfDay(), yesterday.atStartOfDay()).toDays() // another option 

Weitere Informationen finden Sie unter this document (und andere Dokumente re: Java 8 von Oracle).

+7

Das löst eine Ausnahme aus, weil [die Methode Duration.between temporäre Objekte benötigt, die die Einheit SECONDS unterstützen können] (https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#). zwischen-java.time.temporal.Temporal-java.time.temporal.Temporal-). Versuchen Sie stattdessen 'Duration.between (today.atTime (0, 0), greedy.atTime (0, 0)). ToDays()'. – VGR

+2

-1 Dauer ist nicht das richtige Werkzeug dafür. – assylias

+2

Statt 'today.atTime (0, 0)' können Sie 'today.atStartOfDay()' tun. – eee

65

Basierend auf Kommentare der VGR hier ist das, was Sie verwenden können:

ChronoUnit.DAYS.between(firstDate, secondDate) 
7

Sie DAYS.between von java.time.temporal.ChronoUnit

zum Beispiel verwenden können

import java.time.temporal.ChronoUnit; 

public long getDaysCountBetweenDates(LocalDate dateBefore, LocalDate dateAfter) { 
    return DAYS.between(dateBefore, dateAfter); 
} 
14

können Sie until() verwenden:

LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); 
LocalDate christmas = LocalDate.of(2014, Month.DECEMBER, 25); 

System.out.println("Until christmas: " + independenceDay.until(christmas)); 
System.out.println("Until christmas (with crono): " + independenceDay.until(christmas, ChronoUnit.DAYS)); 
+1

Die zweite System.out.println-Anweisung ist, was ich gesucht habe. Vielen Dank! – Sedrick

2

Verwenden Sie die Tage in Enum java.time.temporal.ChronoUnit. Unten ist der Beispielcode:

Ausgang: * Anzahl der Tage zwischen dem Startdatum: 2015.03.01 und Enddatum: 2016.03.03 ist ==> 368. ** Anzahl der Tage zwischen dem Startdatum: 2016.03.03 und Enddatum: 2015.03.01 ist ==> -368 *

package com.bitiknow.date; 

import java.time.LocalDate; 
import java.time.temporal.ChronoUnit; 

/** 
* 
* @author pradeep 
* 
*/ 
public class LocalDateTimeTry { 
    public static void main(String[] args) { 

     // Date in String format. 
     String dateString = "2015-03-01"; 

     // Converting date to Java8 Local date 
     LocalDate startDate = LocalDate.parse(dateString); 
     LocalDate endtDate = LocalDate.now(); 
     // Range = End date - Start date 
     Long range = ChronoUnit.DAYS.between(startDate, endtDate); 
     System.out.println("Number of days between the start date : " + dateString + " and end date : " + endtDate 
       + " is ==> " + range); 

     range = ChronoUnit.DAYS.between(endtDate, startDate); 
     System.out.println("Number of days between the start date : " + endtDate + " and end date : " + dateString 
       + " is ==> " + range); 

    } 

} 
3

Hier gehen Sie:

public class DemoDate { 
    public static void main(String[] args) { 
     LocalDate today = LocalDate.now(); 
     System.out.println("Current date: " + today); 

     //add 1 month to the current date 
     LocalDate date2 = today.plus(1, ChronoUnit.MONTHS); 
     System.out.println("Next month: " + date2); 

     // Put latest date 1st and old date 2nd in 'between' method to get -ve date difference 
     long daysNegative = ChronoUnit.DAYS.between(date2, today); 
     System.out.println("Days : "+daysNegative); 

     // Put old date 1st and new date 2nd in 'between' method to get +ve date difference 
     long datePositive = ChronoUnit.DAYS.between(today, date2); 
     System.out.println("Days : "+datePositive); 
    } 
} 
0

Anzahl der Tage vor Weihnachten vom aktuellen Tag, versuchen Sie diese

System.out.println(ChronoUnit.DAYS.between(LocalDate.now(),LocalDate.of(Year.now().getValue(), Month.DECEMBER, 25))); 
0

Jeder sagt, ChronoUnit.Days.between zu verwenden, aber das delegiert nur zu einer anderen Methode, die Sie sich nennen könnten. Sie könnten also auch firstDate.until(secondDate, ChronoUnit.DAYS) tun.

Die Dokumente für beide erwähnen tatsächlich beide Ansätze und sagen, dass man das verwendet, was besser lesbar ist.

+0

FWIW ... Ich bin mir nicht sicher, warum beide existieren. Gibt es Zeiten, dass man besser lesbar ist und mal das andere ist? Wann warum? – nafg