Calendar定义
Calendar(日历) 类是一个抽象类,它为特定时间(特定时间转化的毫秒数)与日历字段之间的转换提供了一些方法,并为操作日历字段提供了一些方法。该类还为实现包范围外的具体日历系统提供了其他字段和方法(这些字段和方法被定义为 protected)。
注意:1.这里的特定时间转化的毫秒数为:距历元(格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。
2.日期或时间格式字符串不是日历定义的一部分,因为在运行时,用户必须能够修改或重写它们。可以使用DateFormat 格式化日期。
如何获得Catendar对象?
Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化: Calendar now = Calendar.getInstance();
字段操作
可以使用三种方法更改日历字段:set()、add() 和 roll()。
Calendar的set()方法
set(f, value) 将日历字段 f 更改为 value。
set(f, value)方法调用时,将设置一个内部成员变量,来表明f 已经被更改。虽然日历字段 f 是立即更改的,但是直到下次调用 get()、getTime()、getTimeInMillis()、add() 或 roll() 时才会重新计算日历的时间值(以毫秒为单位)。
注意:
1. 多次调用 set() 不会触发多次不必要的计算;
2. 在重新计算日历字段之后,get(f) 没必要通过调用 set 方法返回 value 集合;
3. 月份的起始值为0而不是1,要设置九月时calendar.set(Calendar.MONTH, 8);
public void test4() { public static void main(String[] args) { Date date = new Date(); SimpleDateFormat s=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String curDate = s.format(date); //当前日期 System.out.println("当前日期:" + curDate); Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, 2000); System.out.println("现在是" + calendar.get(Calendar.YEAR) + "年"); calendar.set(2008, 8, 8); int year = calendar.get(Calendar.YEAR);// 获取年 int month = calendar.get(Calendar.MONTH); // 获取月 int day = calendar.get(Calendar.DAY_OF_MONTH); // 获取日 System.out.println("现在是" + year + "年" + month + "月" + day ); } }
Calendar的add()方法
add(f, delta) 将 delta 添加到 f 字段中。这等同于调用 set(f, get(f) + delta),但要遵守以下两个规则:
规则 1:(调用后 f 的值)-(调用前 f 的值)= delta,以字段 f 中发生的任何溢出为模(将8月三十日加一个月为9月31,但9月为30天,那么一天就为溢出)。溢出发生在字段值超出其范围时,结果,下一个更大的字段会递增或递减,并将字段值调整回其范围内。
规则 2:如果期望某一个更小的字段是不变的,但让它等于以前的值是不可能的(8月31天,9月30天),因为在字段 f 发生更改之后,或者在出现其他约束之后,比如时区偏移量发生更改,它的最大值和最小值也在发生更改,然后它的值被调整为尽量接近于所期望的值。更小的字段表示一个更小的时间单元。HOUR 是一个比 DAY_OF_MONTH 小的字段。对于不期望是不变字段的更小字段,无需进行任何调整。日历系统会确定期望不变的那些字段。
示例:假定 GregorianCalendar 最初被设置为 2000 年 8 月 31 日。调用 add(Calendar.MONTH, 13) 将日历设置为 2001 年 9 月 30 日。Add 规则 1 将 MONTH 字段设置为 September,因为向 August 添加 13 个月得出的就是下一年的 September。因为在 GregorianCalendar 中,DAY_OF_MONTH 不可能是 9 月 31 日,所以 add 规则 2 将 DAY_OF_MONTH 设置为 30,即最可能的值。尽管它是一个更小的字段,但不能根据规则 2 调整 DAY_OF_WEEK,因为在 GregorianCalendar 中的月份发生变化时,该值也需要发生变化。
注意:
1. 与 set() 不同,add() 强迫日历系统立即重新计算日历的毫秒数和所有字段。
public class SampleCalendar { public static void main(String[] args) { Calendar c = Calendar.getInstance(); // c.set(2010, 0, 2, 14, 25, 30); // 设置时间 System.out.println("年:" + c.get(Calendar.YEAR)); System.out.println("月:" + (c.get(Calendar.MONTH) + 1)); // 月从0开始 System.out.println("日:" + c.get(Calendar.DAY_OF_MONTH)); // 可以使用Calendar.DATE System.out.println("时(12小时制):" + c.get(Calendar.HOUR)); // 0----11 System.out.println("时(24小时制):" + c.get(Calendar.HOUR_OF_DAY)); // 0----23 System.out.println("分:" + c.get(Calendar.MINUTE)); System.out.println("秒:" + c.get(Calendar.SECOND)); Date date = c.getTime(); System.out.println("时间:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(date)); String week = null; switch (c.get(Calendar.DAY_OF_WEEK)) { case Calendar.SUNDAY: week = "星期日"; break; case Calendar.MONDAY: week = "星期一"; break; case Calendar.TUESDAY: week = "星期二"; break; case Calendar.WEDNESDAY: week = "星期三"; break; case Calendar.THURSDAY: week = "星期四"; break; case Calendar.FRIDAY: week = "星期五"; break; case Calendar.SATURDAY: week = "星期六"; break; } System.out.println(week); //add方法 // 加5年 c.add(Calendar.YEAR, 5); System.out.println("新的年:" + c.get(Calendar.YEAR)); // 减9个月 c.add(Calendar.MONTH, -9); System.out.println("新的月:" + (c.get(Calendar.MONTH) + 1)); // 加25天 c.add(Calendar.DATE, 25); System.out.println("新的日:" + c.get(Calendar.DATE)); date = c.getTime(); System.out.println("新的時間:" + new SimpleDateFormat("yyyy/MM/dd HH:mm:ss").format(date)); } }
Calendar的Rool()方法
roll(f, delta) 将 delta 添加到 f 字段中,但不更改更大的字段。这等同于调用 add(f, delta),但要带以下调整:
Roll 规则:在完成调用后,更大的字段无变化。更大的字段表示一个更大的时间单元。DAY_OF_MONTH 是一个比 HOUR 大的字段。
Caleandar获取年月日
通过Calendar类型的对象调用Calendar的get()方法获得年月日。
public class Test1 { public static void main(String[] args) { Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); // 获取年 int month = calendar.get(Calendar.MONTH) + 1; // 获取月 int day = calendar.get(Calendar.DAY_OF_MONTH); // 获取日 int hour1 = calendar.get(Calendar.HOUR); // 获取时 int hour2 = calendar.get(Calendar.HOUR_OF_DAY); // 24小时表示 int minute = calendar.get(Calendar.MINUTE); // 获取分 int second = calendar.get(Calendar.SECOND); // 获取秒 System.out.println("现在是" + year + "年" + month + "月" + day + "日" + hour1 + "时" + minute + "分" + second + "秒"); } }