为什么java.util.calendar对象的值在调用get(int)后会发生变化

Mar*_*k W 7 java calendar

我试图调试一些遗留代码中的问题.

我已将问题缩小到以下方法:

public String formatDateTimeFromCalendar (Calendar cal){
        StringBuffer sb = new StringBuffer();
        String hr = ""+cal.get(Calendar.HOUR_OF_DAY);
        sb.append(String.format("%02d", hr)); 
        sb.append(":");
        sb.append(String.format("%02d", cal.get(Calendar.MINUTE)));
        sb.append( " on ");
        sb.append(String.format("%02d", cal.get(Calendar.DAY_OF_MONTH)));
        sb.append( "/");
        sb.append(String.format("%02d", cal.get(Calendar.MONTH)+1));
        sb.append( "/");
        sb.append( cal.get(Calendar.YEAR));
        return sb.toString();
    }
Run Code Online (Sandbox Code Playgroud)

调试第2行cal参数是将来的日期.(2015-01-06T00:00:00.000Z)

与第一线3的执行之后cal.get(calPARAM的值已改变(到2014-12-12T00:00:00.000Z)

为什么/怎么会这样?

以下是创建日历的位置:

Calendar startDateAndTime = Calendar.getInstance();
        startDateAndTime.setTime(response.getStartDate().toGregorianCalendar().getTime());
        startDateAndTime.set(Calendar.HOUR_OF_DAY, response.getStartTime().getHour());
        startDateAndTime.set(Calendar.MINUTE, response.getStartTime().getMinute());
        startDateAndTime.set(Calendar.SECOND, response.getStartTime().getSecond());
        startDateAndTime.set(Calendar.MILLISECOND, response.getStartTime().getMillisecond());
Run Code Online (Sandbox Code Playgroud)

response.getStartDate() 返回一个 XMLGregorianCalendar

das*_*ght 3

这是因为调用在宽松模式下get规范化Calendar,并在严格模式下验证它:

返回给定日历字段的值。在宽松模式下,所有日历字段都会标准化。在非宽松模式下,将验证所有日历字段,如果任何日历字段的值超出范围,此方法将引发异常。规范化和验证由该complete()方法处理,该过程依赖于日历系统。

看起来您的Calendar对象处于宽松模式,因此执行了规范化。规范化取决于日历实例。

  • 但是 2015-01-06 是完全有效的,这怎么能正常化到 2014-12-12 呢? (3认同)