2013-06-11 42 views
0

想要獲得下週的第一天(下週一),但撥打getTime()會更改Calendar對象。日曆添加行爲

請告訴我正確的方法來獲得下週的第一天。

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 
     } 
    } 
} 

回答

0

這是一個很好的例子......

Calendar是不容易處理。你的問題是對日期的評估。

如果您打電話給Calendar,則會重新評估日期。 getTime()add()

在第二個(正確的)示例中,在設置一週的第一天並將日曆設置爲2013-06-06後,您可以調用getTime()。之後,您可以更改星期幾並設置新日曆(通過getTime())。因此現在設置爲星期一。

在第一個示例中,您將Calendar設置爲日期並設置星期幾。這導致無效日期(暫時)。 2013-06-06是星期四,你定了星期一。現在哪一天是正確的一週? Calendar現在選擇星期四。

這也是在Javadoc well documented。該部分被命名爲日曆字段分辨率