【问题标题】:Mysterious milliseconds number found in Java Date/Calendar object在 Java 日期/日历对象中发现神秘的毫秒数
【发布时间】:2012-11-01 17:15:21
【问题描述】:

在使用Dates 和Calendar 时有一种奇怪的感觉。重点是我想创建一个特定的日期,例如

Calendar cal = Calendar.getInstance();
cal.set(1970, 0, 1, 0, 0, 0);
Date date = cal.getTime(); 

现在的问题是:它显示了正确的日期,但是在调试时,我在日期变量下看到了一个“fasttime”,例如-3599459。这使我的JUnit 测试失败,因为预期值为-3600000。 似乎日历在初始化时增加了 541 毫秒或类似的东西......

问题是:如果没有这个“我在后台添加一些毫秒”-ghost 函数,是否不能简单地创建一个固定日期?

【问题讨论】:

    标签: java date calendar


    【解决方案1】:

    来自您正在调用的 set 方法的文档:

    设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。保留其他字段的先前值。如果不需要,请先调用 clear()。

    所以它保留了毫秒值。它不会添加几毫秒 - 当您调用 getInstance 时,它会占用系统时间,正如文档中所记录的那样。

    首先调用clear(),或显式设置毫秒值。 (我个人会使用clear()。我还会明确设置时区,只是为了更清楚您期望的时间。

    或者,使用Joda Time 开始 - 这是一个非常更令人愉快的日期/时间 API。

    【讨论】:

    • @Malvin:请注意,如果您使用clear(),这对于您只设置年/月/日或年/月/日/小时/分钟的情况是正确的。 . 这就是为什么我更喜欢使用clear() 而不是你接受的just设置毫秒的答案。
    【解决方案2】:

    在调用cal.getTime()之前添加这一行:

    cal.set(Calendar.MILLISECOND, 0);
    

    这将确保您将毫秒设置为零。

    【讨论】:

      【解决方案3】:

      一个常用的最佳实践是引入一个Clock 对象来包装对您的日期/时间 API 的所有访问。

      基本上,您有两个实现 - 一个 SystemTimeClock 将所有内容转发到您选择的日期/时间提供程序,以及一个用于测试的模拟实现。

      这样,您的代码将独立于 API 的具体细节,并且您的测试可以顺利运行。

      【讨论】:

      • Joda Time 有一个类似的功能,可以将系统时间虚拟设置为特定时刻,这对于测试很有用;见org.joda.time.DateTimeUtils类中的方法。
      • 确实如此。原来有一个类似的问题,Jon Skeet 给了我一个类似的答案,对你的评论也有类似的评论......stackoverflow.com/questions/5622194/time-dependent-unit-tests
      【解决方案4】:

      在处理日期时,我对 Joda Time 库非常满意。我知道这不完全是您问题的答案,但也许值得研究一下:http://joda-time.sourceforge.net/ JavaDocs:http://joda-time.sourceforge.net/apidocs/org/joda/time/DateTime.html

      【讨论】:

      • 我会使用 JodaTime,但不幸的是,我不允许使用任何其他库。
      • 内置于 Java 8 并受 Joda-Time 启发的新 java.time 包是另一种选择。
      【解决方案5】:

      问题是“set”没有设置“毫秒”值,所以毫秒值仍然是你用getInstance创建日历时的值。你可以打电话

      cal.set(Calendar.MILLISECOND, 0);
      

      在调用 getTime 之前,这将确保毫秒为 0。您也可以直接创建公历:

      Calendar cal = new GregorianCalendar(1970, 0, 1, 0, 0, 0);
      assertEquals(0, cal.get(Calendar.MILLISECOND));
      

      如果您想要更完整地实现日历和时间功能,可以使用 Joda Time 代替标准 Java 日历 API。

      【讨论】:

        【解决方案6】:
        Calendar cal = Calendar.getInstance(); 
        cal.setTime(new Date());
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-12
          • 1970-01-01
          • 2018-10-17
          • 2023-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多