2016-06-02 12 views
2

Nach Java API public boolean before(Date when)Java Date Vergleich

wahr, wenn und nur wenn der Zeitpunkt dieses Datum repräsentiert Objekt ist streng früher als der Augenblick, dargestellt durch, wenn; falsch sonst.

Jetzt muss ich prüfen, ob Datumseingabe durch den Benutzer größer ist als das aktuelle Datum dann nur wird es den Eingang sonst werfen Ausnahme akzeptieren, so habe ich versucht, unter

if(userInputDate.before(new Date())){ 
     throw new Exception("Some Message"); 
    } 

Aber wenn beide Zeitpunkt gleich sind dann auch es geht nach innen if Anweisung .Das bedeutet, es wird Zeit berechnen und dann überprüfen, anstatt Datum zu vergleichen? Wenn ja, wie kann ich mein Problem lösen?

Kann mir jemand sagen, wie man dies überprüfen?

+1

, was Sie haben, ist gleichbedeutend mit 'if (userInputDate.getTime() zapl

+0

Wenn Sie die Methode "Date.before (Date t)" verwenden, überprüft sie jeden Datumsparameter, einschließlich Millisekunden. Wenn Sie das Datum mit 'new Date()' erstellt haben, erstellt es ein neues Datum mit der aktuellen Zeit (fast genau in der Millisekunde), so dass die Wahrscheinlichkeit, dass beide Daten gleich sind, sehr unwahrscheinlich ist. Also, in Ihrem Fall würde ich vorschlagen, Sie verwenden (wie @zapl gesagt hat) - "System.currentTimeMillis()" statt. – AsafSavich

+0

Ich denke es liegt daran, dass die 'Date' Klasse auch die Millisekunden enthält. Wenn Sie dann 'userInputDate' mit einem' new Date() 'vergleichen, ist es sehr wahrscheinlich, dass der erste vor dem zweiten auftritt. –

Antwort

1

Die Methode before in der Klasse Date vergleicht die Millisekunde zwischen den Daten, so dass es nicht nur den Tag vergleicht, vergleicht es den Zeitpunkt der Zeit.

Sie könnten eine Methode zu überprüfen, erstellen, wenn die Daten nicht im selben Tag sind und das erste Datum ist vor dem zweiten

public static boolean isBeforeDate(Date date1, Date date2) {  
    SimpleDateFormat fmt = new SimpleDateFormat("yyyyMMdd"); 
    boolean areTheSameDay = fmt.format(date1).equals(fmt.format(date2)); 
    return !areTheSameDay && date1.before(date2); 
} 

Wenn Sie die neue Zeit api In Java8 anstelle der alten verwenden können Date Klasse, können Sie die Klasse LocalDate und die Methode verwenden compareTo:

boolean isBefore = myLocalDate.compareTo(myOtherLocalDate) < 0 
+0

Ich benutze Java7. –

+0

Dann hat die Klasse "Date" keine Methode, genau das zu tun, was Sie brauchen. Sie müssen etwas mehr Arbeit machen, um die Tage zu vergleichen. –

0

Alle Methoden auf java.util.Date, die es erlauben, die Tageszeit, vom Tag des Jahres zu trennen sind veraltet. Daher ist es besser, java.util.Calendar zu verwenden. Zusätzlich sollte berücksichtigt werden, dass es in jedem Jahr typischerweise eine Stunde gibt, die an zwei Tagen endet, wenn die Sommerzeit endet.

Hier zwei Möglichkeiten gibt, können Sie es tun:

public static boolean isBeforeDay(Date date1, Date date2) { 
    // convert date1 to noon on the same day 
    Calendar day1 = Calendar.getInstance(TimeZone.getDefault()); 
    day1.setTime(date1); 
    day1.set(Calendar.HOUR_OF_DAY, 12); 
    day1.set(Calendar.MINUTE, 0); 
    day1.set(Calendar.SECOND, 0); 
    day1.set(Calendar.MILLISECOND, 0); 

    // convert date2 to noon on the same day 
    Calendar day2 = Calendar.getInstance(TimeZone.getDefault()); 
    day2.setTime(date2); 
    day2.set(Calendar.HOUR_OF_DAY, 12); 
    day2.set(Calendar.MINUTE, 0); 
    day2.set(Calendar.SECOND, 0); 
    day2.set(Calendar.MILLISECOND, 0); 

    return day1.before(day2); 
} 


public static boolean isBeforeDay(Date date1, Date date2) { 
    // get yyyymmdd value from date1 
    Calendar day1 = Calendar.getInstance(TimeZone.getDefault()); 
    day1.setTime(date1); 
    int ymd1 = 10000*day1.get(Calendar.YEAR) + 100*day1.get(Calendar.MONTH) + day1.get(Calendar.DAY_OF_MONTH); 

    // get yyyymmdd value from date2 
    Calendar day2 = Calendar.getInstance(TimeZone.getDefault()); 
    day2.setTime(date2); 
    int ymd2 = 10000*day2.get(Calendar.YEAR) + 100*day2.get(Calendar.MONTH) + day2.get(Calendar.DAY_OF_MONTH); 

    return ymd1 < ymd2; 
}