package dateAndTime;import java.util.Calendar;public class CalendarUse {

public static void main(String[] args) {
Calendar c = Calendar.getInstance();
c.set(2009, 7, 8); //2009年8月8号
System.out.println(CalendarUse.getFirstDayOfWeek((Calendar)c.clone()).getTime());
}

//指定日期本周的第一天(周日)
public static Calendar getFirstDayOfWeek(Calendar c) {
//System.out.println("这句话很奇怪:"+c.get(Calendar.DAY_OF_WEEK));//(1)
c.set(Calendar.DAY_OF_WEEK, 1);
return c;
}
}2009年8月8号这周的第一天应该是2009年8月2号,正确结果是:
Sun Aug 02 19:10:46 CST 2009输出以上的前提是我把(1) 处的注释取消掉;如果没取消,输出:
Sun Aug 09 19:11:52 CST 2009为啥呢,(1)这句话有什么功效??还是我程序的问题?!

解决方案 »

  1.   

    沙发,顶下,我在本地运行了下,的确出现这问题啊,我这菜鸟也静待高手解决。我猜测会不会是因为c.clone()的问题呀或者就是calendar有一些使用限制
      

  2.   

    原因不明,估计是 JDK 的 bug参考 Java Bug 数据库 BUG ID 为 4860664, 4851640, 4685354 的 BUG 报告http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=??????
      

  3.   

    跟是不是clone无关,就算不是clone也是这样
    我在api里看到这样一句话
    set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段 f 是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。可能调用set方法后需要调用别的方法才会起作用,此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。
      

  4.   

    示例:假定 GregorianCalendar 最初被设置为 1999 年 8 月 31 日。调用 set(Calendar.MONTH, Calendar.SEPTEMBER) 将该日期设置为 1999 年 9 月 31 日。如果随后调用 getTime(),那么这是解析 1999 年 10 月 1 日的一个暂时内部表示。但是,在调用 getTime() 之前调用 set(Calendar.DAY_OF_MONTH, 30) 会将该日期设置为 1999 年 9 月 30 日,因为在调用 set() 之后没有发生重新计算。
      

  5.   

    的确,楼主给的例子是没有把WEEK_OF_MONTH重新计算,因为发帖时是第三周,今天5.9 正好是第三周第一天
    所以连续两次set之后也是仍定位为第三周第一天也就是
    Sun Aug 09 23:11:38 CST 2009
      

  6.   

     c.set(Calendar.DAY_OF_WEEK, 1);
     这行代码重新设置了一下时间,意思是取本周的那一天
     后一个参数为value%7的结果.
      

  7.   

    [Loaded java.util.Calendar from shared objects file]
    [Loaded java.util.TimeZone from shared objects file]
    [Loaded java.lang.InheritableThreadLocal from shared objects file]
    [Loaded sun.util.calendar.ZoneInfo from shared objects file]
    [Loaded sun.util.calendar.CalendarSystem from shared objects file]
    [Loaded sun.util.calendar.AbstractCalendar from shared objects file]
    [Loaded sun.util.calendar.BaseCalendar from shared objects file]
    [Loaded sun.util.calendar.Gregorian from shared objects file]
    [Loaded sun.util.calendar.ZoneInfoFile from shared objects file]
    [Loaded sun.util.calendar.ZoneInfoFile$1 from shared objects file]
    [Loaded java.util.TimeZone$1 from shared objects file]
    [Loaded java.util.GregorianCalendar from shared objects file]
    [Loaded sun.text.resources.LocaleData from shared objects file]
    [Loaded sun.text.resources.LocaleData$1 from shared objects file]
    [Loaded java.util.ResourceBundle from shared objects file]
    [Loaded java.util.ResourceBundle$ResourceCacheKey from shared objects file]
    [Loaded java.util.ResourceBundle$LoaderReference from shared objects file]get(Calendar.DAY_OF_WEEK))时调用了GregorianCalendar的方法computeTime对时间进行了修改。
      

  8.   

    import java.util.*;
    public class CalendarUse { public static void main(String[] args) {
    CalendarUse c = new CalendarUse();
    Calendar cc = Calendar.getInstance();
    cc.set(2010, 4, 10);
    System.out.println(c.getFirstDayOfWeek(cc).getTime());

    }

     public static Calendar getFirstDayOfWeek(Calendar c) {
            System.out.println("看这儿:"+c.get(Calendar.DAY_OF_WEEK));//(1)
            c.set(Calendar.DAY_OF_WEEK, 2);
            return c;
        }
    }结果是:
    看这儿:2
    Mon May 10 14:40:06 CST 2010貌似没什么问题!!