Calendar类的使用

 

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 + "秒");	
	}

}

 

猜你喜欢

转载自blog.csdn.net/HY845638534/article/details/84712671