日历添加行为

时间:2013-06-11 14:34:23

标签: java calendar add next

想要获得下周的第一天(下周一),但致电getTime()会更改日历对象。

请告诉我获得下周第一天的正确方法。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class Main {
    public static void main(String[] args) {
        {
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            final Calendar cal = new GregorianCalendar( 2013, 5, 6 );
            cal.setFirstDayOfWeek( Calendar.MONDAY );
            //System.out.println( sdf.format( cal.getTime() ) );
            cal.set( Calendar.DAY_OF_WEEK,  Calendar.MONDAY );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-06
            cal.add( Calendar.WEEK_OF_YEAR, 1 );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-13
        }
        {
            final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            final Calendar cal = new GregorianCalendar( 2013, 5, 6 );
            cal.setFirstDayOfWeek( Calendar.MONDAY );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-06
            cal.set( Calendar.DAY_OF_WEEK,  Calendar.MONDAY );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-03
            cal.add( Calendar.WEEK_OF_YEAR, 1 );
            System.out.println( sdf.format( cal.getTime() ) );  // 2013-06-10
        }
    }
}

1 个答案:

答案 0 :(得分:0)

这是一个很好的例子......

Calendar并不容易处理。你的问题是评估日期。

如果您致电Calendar,则会重新评估getTime()的日期add()getTime()

在第二个(正确的)示例中,您在设置一周的第一天后调用2013-06-06,日历设置为getTime()。之后,您可以更改星期几并将日历设置为新(通过Calendar)。因此现在设置为星期一。

在第一个示例中,您将2013-06-06设置为日期并设置星期几。这导致无效日期(暂时)。 Calendar是星期四,你设定星期一。现在哪一周是正确的一周? {{1}}实施现在选择星期四。

这在Javadoc中也是well documented。该部分名为日历字段分辨率