日历没有给出正确的日期

时间:2017-04-05 21:41:25

标签: java

我将使用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());

}

2 个答案:

答案 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}},getTimeInMillisgetTimeadd涉及此类计算。“