→阿童沐

財富==支撐一個人生存多長時間的能力!

导航

<Java工具> java.util.Calendar类使用方法-

  GregorianCalendar类扩展了一个更加通用的Calendar类,这个类描述了日历的一般属性。理论上,可以通过扩展Calendar类来实现中国的阴历或者是火星日历。然而,标准类库中只实现了Gregorian日历。

  将时间与日历分开是一种很好的面向对象设计。通常,最好使用不同的类表示不同的概念。

  Date类知识提供了少量的方法来比较两个时间点。例如before和after方法分别表示一个时间点是否早于另一个时间点,或者晚于另一个时间点

if(today.before(birthday))
    System.out.println("Still time to shop for a gift.");

 

  GregorianCalendar类所包含的方法要比Date类多得多。

  特别是有几个很有用的构造器。

new GregoricanCalendar();

 

  另外,还可以通过提供年月日构造一个表示某个特定日期午夜的日历对象:

new GregorianCalendar(1999, 11, 31);

 

  比较怪异的是,月份从0开始计数。因此11表示十二月份。为了清晰期间,也可以使用常量,如:Calendar.DECEMBER

new GregorianCalendar(1999, Calendar.DECEMBER);

 

  还可以设置时间:

new GregorianCalendar(1999, Calendar.DECEMBER, 31, 23, 59, 59);

 

具体可以参看API帮助文档.


 

setter & getter方法

    如何从封装在某个GregorianCalendar对象内部的日期中获得当前的日、月、年呢?如果希望对这些内容做一些修改,又该怎样做呢?

  在API中可以看到一些setter和getter方法。

  日历的作用是提供某个时间点的年、月、日等信息,要想查询这些设置信息,应该使用GregorianCalendar类中的get方法。为了表达希望得到的项,需要借助于Calendar类中定义的一些常量,如:Calendar.MONTHCalendar.DAY_OF_WEEK.

GregorianCalendar now = new GregorianCalendar();
int month = now.get(Calendar.MONTH);
int weekday = now.get(Calendar.DAY_OF_WEEK);

 

 

API中列出了可以使用的全部常量:

  调用set方法,便可以改变对象的状态:

deadline.set(Calendar.YEAR, 2001);
deadline.set(Calendar.MONTH, Calendar.APRIL);
deadline.set(Calenar.DAY_OF_MONTH, 15);

 

  

  最后还可以为给定日期对象增加天数、星期数、月份等等

deadline.add(Calendar.MONTH, 3); // move deadline by 3 months

如果传递的数值是一个负数,日期就想后移。

  

  get方法与set和add方法在概念上是有区别的。get方法仅仅查看并返回对象的状态而set和add方法却对对象的状态进行修改

  而set和add方法却对对象的状态进行修改。对实例域作出修改的方法被称为更改器方法(mutator method)仅访问实例域而不进行修改的方法被称为访问器方法(accessor method)

注:Java语言不想C++语言,其访问器方法与更改器方法在语法上是没有明显的区别的。

  通常的习惯是在访问器方法名前面加上前缀get,在更改器方法前面加上前缀set。

  例如:在GregorianCalendar类里面有getTime方法和setTime方法,它们分别用来获得和设置日历对象所表示的时间点。

Date time = calendar.getTime();
calendar.setTime(time);

 

  这两个方法在进行GregorianCalendar和Date类之间的转换时非常有用.这里有一个例子.假设已知年、月、日,并且希望创建一个包含这个时间值的Date对象。但是,由于Date类不知道如何操作日历,所以首先需要构造一个GregorianCalendar对象,然后再调用getTime方法获得一个日期对象:

GregorianCalendar calendar  =  new GregorianCalendar(year, month, day);
Date hireDay = calendar.getTime();

 

  与之相反,如果希望获得Date对象中的年、月、日信息就需要构造一个GregorianCalendar对象、设置时间,然后再调用get方法:

GregorianCalendar calendar = new GregorianCalendar();
calendar.setTime(hireDay);
int year = calendar.get(Calendar.YEAR);

 


 

一些实例例句:

构造了一个日历对象,并用当前的日期和事件进行初始化。

Calendar d = new GregorianCalendar();

经过两次调用get方法获得当前日、月:

int today = d.get(Calendar.DAY_OF_MONTH);
int month = d.get(Calendar.MONTH);

 

将d设置为当前月的第一天,并得到这一天为星期几。

d.set(Calendar.DAY_OF_MONTH, 1);
int weekday = d.get(Calendar.DAY_OF_WEEK);

 

注意上面,如果这个月的第一天是星期日,变量weekday就设置为Calendar.SUNDAY,如果这个月的第一天是星期一,就设置为Calendar.MONDAY,依此类推.(实际上,这些值是整数1,2,...,7,但是最好不要依赖北京知识书写代码,而是使用JDK提供的常量)。

Java虚拟机非常注意当前用户的所在地区,不同的地区存在着不同的格式习惯,包括每星期的起始日以及一星期中每天的命名方式。

如果想看到不同地区程序的输出,应该再买房发的第一行中添加代码:

Locale.setDefault(Locale.ITALY);

 

getFirstDayOfWeek方法获得当前地区星期的起始日。为了确定所需要的缩进距离,将日历对象的日减1,直到一个星期的第一天为止:

int firstDayOfWeek = d.getFirstDayOfWeek();
int indent = 0;
while (weekday != firstDayOfWeek) {
    indent++;
    d.add(Calendar.DAY_OF_WEEK, -1);
    weekday = d.get(Calendar.DAY_OF_WEEK);
}

 

输出表示星期几名称的头.这个操作可以通过调用DateFormatSymbols类方法实现:

String[] weekdayNames = new DateFormatSymbols().getShortWeekdays();

 

getShortWeekdays方法返回用户语种所命名的表示星期几的缩写字符串(例如:英语将返回"Sun","Mon"等)。数组眼红星期数作为索引。

do
{
    System.out.printf("%4s", weekdayNames[weekday]);
    d.add(Calendar.DAY_OF_MONTH, 1);
    weekday = d.get(Calendar.DAY_OF_WEEK);
}
while(weekday != firstDayOfWeek);

 

最后加入我写的一个小程序:

package cn.bupt.edu.calendar;

import java.util.Calendar;

public class CalendarT {
    public static void main(String[] args) {
        Calendar c = Calendar.getInstance();        // 获取当前时间
        c.set(Calendar.HOUR_OF_DAY, 13);
        System.out.println(c.getLeastMaximum(Calendar.HOUR_OF_DAY));
        System.out.println(c.getGreatestMinimum(Calendar.HOUR_OF_DAY));
        
        // 当天播放时间
        Calendar cDay = Calendar.getInstance();        // 用于获取时间点的时间类
        cDay.set(Calendar.HOUR_OF_DAY, 16);
        cDay.set(Calendar.MINUTE, 59);
        
        if (c.compareTo(cDay) < 0) {
            System.out.println("00:00 -- " + c.get(Calendar.HOUR_OF_DAY) + ":00");
        } else {
            System.out.println("00:00 -- " + cDay.get(Calendar.HOUR_OF_DAY) + ":00");
        }
        
        // 前一小时播放时间
        Calendar cLastHour = Calendar.getInstance();
        cLastHour.set(Calendar.HOUR_OF_DAY, 17);
        cLastHour.set(Calendar.MINUTE, 0);
        
        if (c.compareTo(cLastHour) >= 0) {
            System.out.println(16);
        } else {
//            int hour = c.get(Calendar.HOUR_OF_DAY);
//            System.out.println("last hour : " + (hour - 1));
            c.add(Calendar.HOUR_OF_DAY, -1);
            System.out.println("last hour : " + c.get(Calendar.HOUR_OF_DAY));
        }
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted on 2012-07-24 00:25  阿童沐  阅读(943)  评论(0)    收藏  举报