日期总是变得不同getTime()

时间:2018-04-25 13:17:52

标签: java date

我想知道为什么我总是以毫秒为单位来区分这个日期。

有什么想法吗?

这是输出:

date = 1572794103293 ms 
date2 = 1572794103341 ms  
date3 = 1572794103341 ms  
date4 = 1572794103341 ms

这是代码:

Date date = createDate();
Date date2 = createDate();
Date date3 = createDate();
Date date4 = createDate();
System.out.println(date.getTime());
System.out.println(date2.getTime());
System.out.println(date3.getTime());
System.out.println(date4.getTime());

private static Date createDate() {
      Calendar c = GregorianCalendar.getInstance();
        c.set(2019, Calendar.NOVEMBER, 03, 16, 15, 03);
        return c.getTime();
}

2 个答案:

答案 0 :(得分:1)

Calendar.set的文档中,有人说:

  

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

原因是并非所有字段都使用此方法设置,在您的情况下,您没有设置MILLISECOND。因此它在创建实例时保留值。

Calendar.clear的来电

  

设置此Calendar的所有日历字段值和时间值(与Epoch的毫秒偏移量)undefined。

一个简单的例子:

    Calendar c = GregorianCalendar.getInstance();
    c.clear();
    c.set(2019, Calendar.NOVEMBER, 03, 16, 15, 03);

    System.out.println(c.getTimeInMillis());
  

1572794103000

未定义的毫秒数将为0

答案 1 :(得分:1)

除了评论和AxelH的答案,提到Calendar实例的毫秒不会被Calendar.set更改的事实,仍然有好奇心,你得到{{{{ 1}},date2date3,但date4的值不同。

这是因为第一次调用date时,JVM必须初始化createDate()类,这在Date初始化后发生。

因此,在第一次呼叫时Calendar c需要的时间多于连续呼叫的时间,您可以将其视为c.getTime()的值与其他3个实例之间的差异。

如果您在第一次致电date之前添加了对new Date()的来电,则每个值之间的差异应该相同。

请注意,这不能解决您的问题,如果您的计算机足够快,它就会隐藏它。它只是对你得到的特定价值的解释。