ITEEDU

Java Gossip: 使用 Calendar

您可以使用Date来取得完整的日期时间显示,但如果您想要单独取得某个时间或日期信息的话该如何?例如您想知道现在是5月的第几天?

您要使用Calendar类别,在这之前,您要先知道Calendar的一些方法取回的数字是对应于Calendar本身的常数,也就是说并不是您取回1 这个数字,就表示今天是星期一。

想要取得现在的时间,首先使用Calendar的getInstance()取得一个Calendar的实例,例如:

Calendar rightNow = Calendar.getInstance();

如果现在您想知道现在是公元几年,则可以使用get()方法并指定常数,例如:

System.out.println(rightNow.get(Calendar.YEAR));

如果现在是2005年,则上例会显示2005的数字,依照这个例子,假设撰写本文的时间是5月份,而您现在想使用程序取得现在的月份,则下例您可能会有些困惑:

System.out.println(rightNow.get(Calendar.MONTH));

程序会显示4这个数字,而不是您预期的5,因为传回的4并不是代表月份,而是对应于Calendar.MAY常数的值, Calendar在月份上的常数值从Calendar.JANUARY开始是0,到Calendar.DECEMBER的11,所以您如果想要显示传回值 的真正意涵,可以如下撰写:

String[] months = {"一月", "二月", "三月", "四月",
									"五月", "六月", "七月", "八月",
									"九月", "十月", "十一月", "十二月"};
Calendar rightNow = Calendar.getInstance();
System.out.println(months[rightNow.get(Calendar.MONTH)]);

同样的,如果您想要取得星期信息,要记得常数从Calendar.SUNDAY是1,到Calendar.SATURDAY是7,由于对应的数并不是从0 开始,所以如果要使用如上的数组来对应的话,第一个数组值就不包括信息,例如:

String[] dayOfWeek = {"", "日", "一", "二",
											"三", "四", "五", "六"};
Calendar rightNow = Calendar.getInstance();
System.out.println(dayOfWeek[rightNow.get(Calendar.DAY_OF_WEEK)]);

总之您要记得传回的值是对应于Calendar的某个常数,会这样设计的原因在于实际上英文中对于星期或月份并不附以数字上的意涵,如Sunday、 Monday等,幸而除了月份、星期之外,传回的值都对应于真正的时间意涵,毕竟像公元、小时、分等等本身就是以数字表示。

如果怕搞混,使用switch来比对是个不错的作法,例如:

CalendarDemo.java
package onlyfun.caterpillar;
import java.util.Calendar;
public class CalendarDemo {
	public static void main(String[] args) {
		Calendar rightNow = Calendar.getInstance();
		System.out.println("现在时间是:");
		System.out.println("公元:" +
		rightNow.get(Calendar.YEAR));
		System.out.println("月:" +
		getChineseMonth(rightNow));
		System.out.println("日:" +
		rightNow.get(Calendar.DAY_OF_MONTH));
		System.out.println("星期:" +
		getChineseDayOfWeek(rightNow));
	}
	public static String getChineseMonth(Calendar rightNow) {
		String chineseMonth = null;
		switch(rightNow.get(Calendar.MONTH)) {
			case Calendar.JANUARY:
			chineseMonth = "一";
			break;
			case Calendar.FEBRUARY:
			chineseMonth = "二";
			break;
			case Calendar.MARCH:
			chineseMonth = "三";
			break;
			case Calendar.APRIL:
			chineseMonth = "四";
			break;
			case Calendar.MAY:
			chineseMonth = "五";
			break;
			case Calendar.JUNE:
			chineseMonth = "六";
			break;
			case Calendar.JULY:
			chineseMonth = "七";
			break;
			case Calendar.AUGUST:
			chineseMonth = "八";
			break;
			case Calendar.SEPTEMBER:
			chineseMonth = "九";
			break;
			case Calendar.OCTOBER:
			chineseMonth = "十";
			break;
			case Calendar.NOVEMBER:
			chineseMonth = "十一";
			break;
			case Calendar.DECEMBER:
			chineseMonth = "十二";
			break;?
		}
		return chineseMonth;
	}
	public static String getChineseDayOfWeek(
	Calendar rightNow) {
		String chineseDayOfWeek = null;
		switch(rightNow.get(Calendar.DAY_OF_WEEK)) {
			case Calendar.SUNDAY:
			chineseDayOfWeek = "日";
			break;
			case Calendar.MONDAY:
			chineseDayOfWeek = "一";
			break;
			case Calendar.TUESDAY:
			chineseDayOfWeek = "二";
			break;
			case Calendar.WEDNESDAY:
			chineseDayOfWeek = "三";
			break;
			case Calendar.THURSDAY:
			chineseDayOfWeek = "四";
			break;
			case Calendar.FRIDAY:
			chineseDayOfWeek = "五";
			break;
			case Calendar.SATURDAY:
			chineseDayOfWeek = "六";
			break;?
		}
		return chineseDayOfWeek;
	}
}

在取得一个Calendar的实例后,您可以使用setTime()方法给它一个Date对象,将之改变为Date目前的时间,例如:

Calendar c = Calendar.getInstance();
Date date = new Date(10000000000L);
c.setTime(date);

还可以使用add()方法,来改变Calendar的时间,例如:

c.add(Calendar.MONTH, 1); // 目前时间加1个月
c.add(Calendar.HOUR, 3); // 目前时间加3小时
c.add(Calendar.YEAR, -2); // 目前时间减2年
c.add(Calendar.DAY_OF_WEEK, 3); // 目前的时间加3天

如果打算只针对日期中某个字段加减,则可以使用roll()方法,例如:

c.roll(Calendar.MONTH, 10); // 只增加月的字段值为10个月

在上例中,假设是2006/10/1,则执行过后的Calendar实例,其中的时间将是2006/8/1,也就是只改变月份的字段。