9

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

天花板

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

Ceil 此日期,保留指定为最重要字段的字段。

例如,如果您的日期时间为 2002 年 3 月 28 日 13:45:01.231,如果您通过 HOUR,它将返回 28 Mar 2002 13:00:00.000。如果这与 MONTH 一起传递,它将返回 2002 年 3 月 1 日 0:00:00.000。

对比

截短

公共静态日期截断(日期日期,int字段)

截断此日期,将字段指定为最重要的字段。

例如,如果您的日期时间为 2002 年 3 月 28 日 13:45:01.231,如果您通过 HOUR,它将返回 28 Mar 2002 13:00:00.000。如果这与 MONTH 一起传递,它将返回 2002 年 3 月 1 日 0:00:00.000。

4

3 回答 3

8

为了补充吉姆的答案,我怀疑天花板方法存在 Javadoc 错误。使用3.0 javadoc更新了对 ceiling(Date,int) 的描述(与相同方法的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());
}
于 2012-05-14T23:16:12.380 回答
5

答案在文档中:

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

我会解释为“你是对的,但这是有原因的”

于 2012-05-14T22:53:28.460 回答
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 不会。

于 2012-05-14T23:16:37.867 回答