2012-05-14 9 views
9

Es ist nicht klar, in dem Java-Dokument, was der Unterschied zwischen DateUtils.ceiling und DateUtils.truncate ist. Ist das Java-Dokument falsch? Kann jemand das klären?Unterschied zwischen Java DateUtils.ceiling und DateUtils.truncate

Decke

public static Datum Decke (Datum Datum, int Feld)

Ceil dieses Datum, das Feld als das bedeutendste Feld angegeben zu verlassen.

Zum Beispiel, wenn Sie das Datumzeit von 28. März 2002 13 hatte: 45: 01,231, wenn Sie mit Stunde vergangen, es würde zurückkehren 28. März 2002 13: 00: 00.000. Wenn das mit MONTH übergeben wurde, würde es 1 März 2002 0: 00: 00.000 zurückgeben.

vs

truncate

public static Datum truncate (Datum Datum, int Feld)

Kürzen dieses Datum, das Feld als das signifikante Feld angegeben zu verlassen.

Zum Beispiel, wenn Sie das Datumzeit von 28. März 2002 13 hatte: 45: 01,231, , wenn Sie mit Stunde vergangen, es würde zurückkehren 28. März 2002 13: 00: 00.000. Wenn dies mit MONTH übergeben wurde, würde es 1 März 2002 0: 00: 00.000 zurückgeben.

+0

FYI, das Ergebnis der Methode ist nur im Rückgabewert und der Parameter 'date' wird nicht geändert.Das Javadoc ist in diesem Punkt zweideutig. – cmcginty

Antwort

6

Um auf Jims Antwort hinzufügen, ich vermute, es ist ein Javadoc Fehler an der Decke Methode. Die Beschreibung für ceiling (Datum, int) wurde mit der 3.0 javadoc aktualisiert (vergleichen Sie mit 2.5 javadoc für die gleiche Methode) ... und obwohl die anderen nicht aktualisiert wurden, verwendet diese Methode Code, der der Kalenderversion gemeinsam ist ... Oder mit ein einfacher Testfall konnte man sehen, dass sie (für mich mit 3.1 mindestens :))

@Test 
public void testCeil() { 
    final Calendar date = new GregorianCalendar(); 
    date.clear(); 
    date.set(2002, 3, 28, 13, 45, 01); 

    System.out.println(date.getTime()); 
    System.out.println(DateUtils.ceiling(date, Calendar.HOUR).getTime()); 
    System.out.println(DateUtils.ceiling(date.getTime(), Calendar.HOUR)); 
    System.out.println(DateUtils.truncate(date, Calendar.HOUR).getTime()); 
    System.out.println(DateUtils.truncate(date.getTime(), Calendar.HOUR)); 
    System.out.println(date.getTime()); 
} 
4

Die Antwort ist in der Dokumentation:

Die truncate, Decke und runde Methoden könnten die Math.floor(), Math.ceil() oder Math.round Versionen für Termine Auf diese Weise betrachtet werden Datumsfelder werden in der Bottom-Up-Reihenfolge ignoriert.

Was ich würde interpretieren als „Du bist richtig, aber es gibt einen Grund“

3

die Dokumentation auf einige der älteren Versionen für die ceil() -Methode ist FALSCH beide das gleiche verhalten. Es wurde an einem gewissen Punkt korrigiert, und hier ist die Dokumentation von 3,1:

public static Date ceiling(Date date, 
          int field) 
Ceil this date, leaving the field specified as the most significant field. 

For example, if you had the datetime of 28 Mar 2002 13:45:01.231, if you passed with HOUR, it would return 28 Mar 2002 14:00:00.000. If this was passed with MONTH, it would return 1 Apr 2002 0:00:00.000. 

So, während ceil() und trunc(), die beide alle verbleibenden Felder minimieren (in einigen Fällen Sätzen 0, aber für Monat ist wird den Tag auf 1 setzen, ceil() wird das Feld, das Sie übergeben, um 1 erhöhen, während trunc nicht.

Verwandte Themen