Java DateUtils.ceiling和DateUtils.truncate之间的区别

时间:2012-05-14 22:19:45

标签: java datetime

在java doc中不清楚DateUtils.ceilingDateUtils.truncate之间的区别是什么。 java doc是错的吗?有人可以澄清一下吗?

  

天花板

     

公共静态日期上限(日期日期,                              int field)

     

Ceil这个日期,将该字段指定为最重要的字段。

     

例如,如果您的日期时间为2002年3月28日13:45:01.231,那么,如果您   通过HOUR,它将于2002年3月28日13:00 00:00返回。如果是的话   通过MONTH,它将于2002年3月1日0:00:00.000返回。

VS

  

截断

     

public static Date truncate(Date date,                               int field)

     

截断此日期,将指定的字段保留为最多   重要的领域。

     

例如,如果您的日期时间为2002年3月28日13:45:01.231,   如果你通过HOUR,它将于2002年3月28日13:00:00.000 返回。   如果通过MONTH,它将于2002年3月1日0:00:00.000返回。

3 个答案:

答案 0 :(得分:7)

为了补充Jim的答案,我怀疑天花板方法有一个Javadoc错误。天花板(Date,int)的描述已使用3.0 javadoc更新(与同一方法的2.5 javadoc比较)...虽然其他未更新,但该方法使用常用的代码日历版本......或者使用一个简单的测试用例,你可以看到它们的行为相同(至少对我来说是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());
}

答案 1 :(得分:5)

答案在文档中:

  

truncate,ceiling和round方法可以被认为是日期的Math.floor(),Math.ceil()或Math.round版本。这样,日期字段将以自下而上的顺序被忽略。

我将其解释为“你是对的,但有一个原因”

答案 2 :(得分:3)

ceil()方法的一些旧版本的文档是错误的。它已在某些时候得到纠正,这里是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.

因此,虽然ceil()和trunc()都会最小化所有剩余的字段(在某些情况下设置为0,但对于MONTH,它会将日期设置为1),ceil()实际上会增加您传入的字段1,而trunc不会。