2012-05-14 17 views
9

No está claro en el documento java cuál es la diferencia entre DateUtils.ceiling y DateUtils.truncate. Es el documento de Java incorrecto? ¿Alguien puede aclarar esto?Diferencia entre Java DateUtils.ceiling y DateUtils.truncate

techo

Fecha techo static (Fecha Fecha, campo int)

Ceil esta fecha, dejando el campo especificado como el campo más importante.

Por ejemplo, si usted tenía la fecha y hora de 28 de Mar de 2002 13: 45: 01,231, si pasó con la hora, sería de retorno 28 Mar de 2002 13: 00: 00.000. Si esto fue pasado con MES, devolvería 1 de marzo de 2002 0: 00: 00.000.

vs

truncado

(fecha Fecha, campo int) Fecha truncado pública estática

truncar esta fecha, dejando el campo especificado como el campo más importante .

Por ejemplo, si usted tenía la fecha y hora de 28 de Mar de 2002 13: 45: 01,231, si aprobó con la hora, sería de retorno 28 Mar de 2002 13: 00: 00.000. Si esto se aprobó con MES, devolvería el 1 de marzo de 2002 0: 00: 00,000.

+0

FYI, el resultado del método está en el valor de retorno solamente, y el parámetro 'fecha' no se modifica.El javadoc es ambiguo sobre este punto. – cmcginty

Respuesta

6

para añadir a la respuesta de Jim, sospecho que hay un error en el método de Javadoc techo. La descripción del techo (Fecha, int) se actualizó con el 3.0 javadoc (compárese con el 2.5 javadoc para el mismo método) ... y aunque los otros no se actualizaron, ese método usa código común a la versión del Calendario ... O usando un caso simple prueba se podía ver que los dos se comportan de la misma (para mí con al menos 3.1 :))

@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 respuesta está en la documentación:

Los truncado, el techo y los métodos ronda podría ser considerado como el Math.floor(), Math.ceil() o Math.round versiones para las fechas de esta manera los campos de fecha serán ignorados en orden ascendente.

Qué yo interpretaría como "Usted es correcta, pero hay una razón"

3

la documentación sobre algunas de las versiones más antiguas de la ceil() método es erróneo. Se ha corregido en algún momento, y aquí está la documentación de 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. 

Así, mientras que ceil() y trunc() tanto minimizan todos los campos restantes (en algunos casos se pone a 0, pero por mes establecerá el día en 1), ceil() incrementará en realidad el campo que pasa en 1, mientras que trunc no lo hará.