<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.MONTH或Calendar.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)); } } }
浙公网安备 33010602011771号