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)这句话有什么功效??还是我程序的问题?!
我在api里看到这样一句话
set(f, value) 将日历字段 f 更改为 value。此外,它设置了一个内部成员变量,以指示日历字段 f 已经被更改。尽管日历字段 f 是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。因此,多次调用 set() 不会触发多次不必要的计算。可能调用set方法后需要调用别的方法才会起作用,此外,与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。
所以连续两次set之后也是仍定位为第三周第一天也就是
Sun Aug 09 23:11:38 CST 2009
这行代码重新设置了一下时间,意思是取本周的那一天
后一个参数为value%7的结果.
[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对时间进行了修改。
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貌似没什么问题!!