2012-05-14 19 views
9

Non è chiaro nel java doc quale sia la differenza tra DateUtils.ceiling e DateUtils.truncate. Il documento java è sbagliato? Qualcuno può chiarirlo?Differenza tra Java DateUtils.ceiling e DateUtils.truncate

soffitto

Data soffitto public static (data Data, int campo)

Ceil questa data, lasciando il campo specificato come il settore più significativo.

Ad esempio, se si ha il datetime di 28 Mar 2002 13: 45: 01,231, se superato con ore, che sarebbe tornato 28 Mar 2002 13: 00: 00.000. Se questo era passato con MONTH, restituirebbe 1 Mar 2002 0: 00: 00.000.

vs

troncare

(data Data, int campo) static Data troncare pubblico

Tronca questa data, lasciando il campo specificato come il campo significativo più .

Ad esempio, se si ha il datetime di 28 Mar 2002 13: 45: 01,231, se hai superato con ore, che sarebbe tornato 28 Mar 2002 13: 00: 00.000. Se questo è stato passato con MONTH, restituirebbe 1 Mar 2002 0: 00: 00.000.

+0

FYI, il risultato del metodo è solo nel valore di ritorno e il parametro "data" non viene modificato.Il javadoc è ambiguo su questo punto. – cmcginty

risposta

6

Per aggiungere alla risposta di Jim, ho il sospetto c'è un errore Javadoc sul metodo soffitto. La descrizione per il ceiling (Date, int) è stata aggiornata con lo 3.0 javadoc (confronta con lo 2.5 javadoc per lo stesso metodo) ... e sebbene gli altri non siano stati aggiornati, quel metodo usa il codice comune alla versione di Calendar ... O usando un semplice banco di prova si poteva vedere che entrambi si comportano allo stesso (per me con 3.1 almeno :))

@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

La risposta è nella documentazione:

Le versioni troncare, soffitto e metodi rotonde potrebbe essere considerato il Math.floor(), Math.ceil() o Math.round per le date in questo modo i campi data verranno ignorati nell'ordine bottom-up.

che vorrei interpreto come "Sei corretto, ma c'è un motivo"

3

la documentazione su alcune delle versioni più vecchie per l'ceil() il metodo è sbagliato. E 'stato corretto a un certo punto, e qui è la documentazione da 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. 

Così, mentre ceil() e trunc() sia minimizzare tutti i campi rimanenti (in alcuni casi imposta a 0, ma per mese imposterà il giorno a 1), ceil() effettivamente incrementerà il campo che passi di 1, mentre trunc no.

Problemi correlati