2017-04-05 80 views
1

我将使用MM/dd/yyyy格式 下面的代码应该给我“07/01/2017”,而是它给我“06/30/2017”,但如果我取消注释// cal.getTime();我得到“07/01/2017”日历没有给出正确的日期

有人可以解释这种行为。

public static void main(String[] args) { 
    Calendar cal = Calendar.getInstance(); 
    Date date = new Date("04/02/2017"); 
    cal.setTime(date); 
    System.out.println(date); 
    Calendar nQtStartDate = new GregorianCalendar(cal.get(Calendar.YEAR), 
      Calendar.JUNE, 30); 
    cal = nQtStartDate; 
    //cal.getTime(); 

    cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); 


    System.out.println(cal.getTime()); 

} 

回答

0

当你调用getTime()方法在内部更新时间,并更改变量isTimeSet(对于我所看到的阅读源代码,使得类不是线程安全的)的状态。

public long getTimeInMillis() { 
    if (!isTimeSet) { 
     updateTime(); 
    } 
    return time; 
} 

在另一方面cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY)复位的内部时的状态的声明(改变可变isTimeSet为false)。

如果内部time的值有效,则变量isTimeSet的状态为true

总结一下:不要在调用getTime()方法后更改日历配置(即设置星期几),因为这会重置日历的内部状态。

0

相信的Javadoc Calendar解释:

“在Calendar设置的任何字段值不会被解释,直到它需要计算其时间值(从历元毫秒)或日历字段的值。调用get,getTimeInMillis,getTime,addroll涉及这样的计算。“

+0

谢谢!这有帮助..但是nQtStartDate是一个新的时间对象,它没有被改变,如果你对它做了相同的操作,它仍然不会给我正确的日期。 –

+0

“但”?应该显而易见,引用的段落适用于这种情况。它因为你设置了'cal = nQtStartDate;'而被改变了。 –