【问题标题】:Difference between Java DateUtils.ceiling and DateUtils.truncateJava DateUtils.ceiling 和 DateUtils.truncate 之间的区别
【发布时间】:2012-05-14 22:19:44
【问题描述】:

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

天花板

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

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

例如,如果您的日期时间是 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,它将返回 2002 年 3 月 28 日 13:00:00.000。 如果这与 MONTH 一起传递,它将返回 2002 年 3 月 1 日 0:00:00.000。

【问题讨论】:

  • 仅供参考,方法结果仅在返回值中,'date'参数未修改。 javadoc 对这一点模棱两可。

标签: java datetime


【解决方案1】:

为了补充 Jim 的答案,我怀疑天花板方法存在 Javadoc 错误。天花板(日期,整数)的描述已更新为 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());
}

【讨论】:

    【解决方案2】:

    答案在文档中:

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

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

    【讨论】:

      【解决方案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-01-21
        • 2016-06-29
        • 2012-09-03
        • 2016-03-28
        • 2017-12-23
        • 2012-02-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多