我将使用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 :(得分:1)
当您调用getTime()
方法在内部更新时间并更改变量isTimeSet
的状态时(对于我看到的源代码,这使得该类不是线程安全的)。
public long getTimeInMillis() {
if (!isTimeSet) {
updateTime();
}
return time;
}
另一方面,语句cal.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY)
重置了内部时间的状态(将变量isTimeSet
更改为false)。
如果内部isTimeSet
的值有效,则变量true
的状态为time
。
总结一下:请勿在调用getTime()
方法后更改日历配置(即设置星期几),因为这会重置日历的内部状态。
答案 1 :(得分:0)
我相信Calendar
的Javadoc解释了这个:
“Calendar
中设置的任何字段值都不会被解释,直到需要计算其时间值(Epoch的毫秒数)或日历字段的值。调用get
,{{ 1}},getTimeInMillis
,getTime
和add
涉及此类计算。“