常用访问、修改日期时间的方法:
void add(int field,int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
void get(int field):返回指定日历的字段
void getActualMaximum(int field):返回指定日历字段可能拥有的最大值。例如月,最大值为11
void getActualMinimum(int field):返回指定日历字段可能拥有的最小值。例如月,最小值为0
void roll(int field,int amount): 与add()方法类似,区别在于加上amount后超过了该字段所能表示的最大范围,也不会向上一个字段进位
void set(int field,int value):将给定的日历字段设置为给定值
void set(int year,int month,int date):设置Calendar对象的年、月、日3个字段
void set(int year,int month,int date,int hourOfDay,int minute,int second):设置Calendar对象的年、月、日、时、分、秒6个字段的值
各方法中的field为日期中的year、month、date、hourOfDay、minute、second的变量。
Calendar的方法示例:
import java.util.*;
import static java.util.Calendar.*;
public class CalendarTest
{
public static void main(String[] args)
{
Calendar c = Calendar.getInstance();
// 取出年
System.out.println(c.get(YEAR));
// 取出月份
System.out.println(c.get(MONTH));
// 取出日
System.out.println(c.get(DATE));
// 分别设置年、月、日、小时、分钟、秒
c.set(2003 , 10 , 23 , 12, 32, 23); //2003-11-23 12:32:23
System.out.println(c.getTime());
// 将Calendar的年前推1年
c.add(YEAR , -1); //2002-11-23 12:32:23
System.out.println(c.getTime());
// 将Calendar的月前推8个月
c.roll(MONTH , -8); //2002-03-23 12:32:23
System.out.println(c.getTime());
}
}
add和roll方法的区别
当被修改的字段超出它允许的范围时,会发生进位,即上一级字段也会增大。
Calendar call=Calendar,getInstance();
call.set(2003,7,23,0,0,0);
//2003-8-23
call.add(Month,6);
//2003-8-23 => 2004-2-23
8月份加上6个月会使月成为13,则年会进一位
如果下一级字段也需要改变,那么该字段会修正到变化最小的值。
Calendar call=Calendar,getInstance();
call.set(2003,7,31,0,0,0);
//2003-8-31
call.add(Month,6);
//2003-8-23 => 2004-2-29
8月份加上6个月会使月份成为13,则年会进一位.此时月份会相应的变为2,但是日期31在2月不符合规则,add方法会使31变为29,同为2月的最后一天。
对于roll方法的处理规则:
Calendar call=Calendar,getInstance();
call.set(2003,7,23,0,0,0);
//2003-8-23
call.add(Month,6);
//2003-8-23 => 2003-2-23
当修改字段超出允许的范围,上一级不会增大。
roll方法下一字段的处理规则与add相同
set方法的延迟修改
set(f,value)在将f更改为value时,尽管f会立即改变,但是Calendar所代表的时间不会立即改变,直到下次调用 get()、getTime()、add()、roll().....时才会重新计算。这样做的优势是当set方法多次调用时,不会触发多次不必要的计算。
例如:
import java.util.*;
import static java.util.Calendar.*;
public class LazyTest
{
public static void main(String[] args)
{
Calendar cal = Calendar.getInstance();
cal.set(2003 , 7 , 31);
//2003-8-31
// 将月份设为9,但9月31日不存在。
// 如果立即修改,系统将会把cal自动调整到10月1日。
cal.set(MONTH , 8);
//下面代码输出10月1日
//System.out.println(cal.getTime());
//①
//设置DATE字段为5
cal.set(DATE , 5);
//②
System.out.println(cal.getTime());
//③
}
}
在上述程序中,如果System.out.println(cal.getTime());不被屏蔽,则会输出2003-10-1和2003-10-5. 当System.out.println(cal.getTime());被屏蔽,则将month值的内部变量设为8实际为9月份,然后再将DATE设为5,此时如果输出则为2003-9-5
参考资料:疯狂java讲义
java编程思想
马皓等.java语言程序设计.北京:清华大学出版社
Calendar的方法示例:
add和roll方法的区别
set方法的延迟修改