在日期格式化一文中我曾经简单的叙述了从一个java.util.Date日期类输出定制日期格式文本的方法。今天我们将进入一个真正的难题,去了解java中真正的日期对象Calendar类,并且在分析过程中建立一个实用swing日历Bean。
本人曾经在网上搜索过一些实用swing日历,但他们的实现都比较复杂,在这里我们将只使用一个类和标准的swing组件来实现这个日历,从而使这个Bean可以简单的被复用到别处。
一、Calendar是什么?
Calendar类是java标准库提供的日历工具类,它是一个抽象类。在它之中定义了很多有用的方法,最有用的就是可以自由变换日期和时间的set方法,以及得到定制日期输出的get方法。因为Calendar是一个抽象类,所以它不能使用new方法创建实例,它需要使用下面这个方法得到实例:Calendar calendar=Calendar.getInstance();
在Calendar类中把日期分成年、月、日、时、分、秒、微秒、星期八个部分,每一个部分又有一个或多个域(Field)与之对应,在使用set或get方法时,实际上是通过这些域来访问的。每一个域都是一个静态整型常量,它们是:
域 | 代表意义 |
AM_PM | 上午/下午标志 |
DATE | 完整日期标志 |
DAY_OF_MONTH | 本月第几天 |
DAY_OF_WEEK | 星期几 |
DAY_OF_WEEK_IN_MONTH | (尚未理解) |
DAY_OF_YEAR | 本年度的第几天 |
DST_OFFSET | 时区偏移量 |
ERA | 公元标志 |
HOUR | 小时(12小时制,分上下午) |
HOUR_OF_DAY | 小时(24小时制,不分上下午) |
MILLISECOND | 微秒 |
MINUTE | 分钟 |
MONTH | 月份 |
SECOND | 秒 |
WEEK_OF_MONTH | 本月第几个星期 |
WEEK_OF_YEAR | 本年度的第几个星期 |
YEAR | 年份 |
ZONE_OFFSET | 相对GMT时区的微秒级时间偏移 |
除了通过set和get方法访问域值的功能外,Calendar还提供了一些有用的方法:
方法 | 参数 | 意义 |
getActualMaximum | int field | 得到当前时间指定域值的最大值 |
getActualMinimum | 同上 | 得到当前时间指定域值的最小值 |
getFirstDayOfWeek
| 空
| 得到当前时区一个星期第一天的表示, 如:在美国星期天是一个星期的第一天; 在法国则是星期一。 |
getTime | 空 | 返回一个java.util.Date日期对象 |
getTimeInMillis
| 空
| 返回当前时间的微秒累计值,就像 java.util.Date中的getTime方法一样 |
getTimeZone | 空 | 返回当前时区 |
isSet | int field | 设置域是否可以改写 |
setFirstDayOfWeek
| int value
| 设置当前时区一个星期第一天的表示, 如:在美国星期天是一个星期的第一天; 在法国则是星期一。 |
setTime
| Date date
| 为当前日历重新设置一个java.util.Date 日期对象作为当前时间 |
setTimeInMillis | 空 | 设置一个时间的微秒累计值作为当前时间 |
setTimeZone | TimeZone value | 设置当前的时区 |
这里只是大概的叙述了一下Calendar类的概况,如果想更加清楚的了解其中的细节,请查看j2sesdk提供的Calendar源文件。