Java的java.util.Calendar和GregorianCalendar

时间:2020-01-09 10:35:56  来源:igfitidea点击:

Java的java.util.Calendar类用于执行日期和时间算术。只要我们有比仅表示日期和时间更高级的内容,就可以使用该类。

java.util.Calendar类是抽象的,这意味着我们无法实例化它。原因是世界上有多个日历。例如,阿拉伯日历使用的第0年与大多数西方国家使用的公历不同。

实例化一个GregorianCalendar

Java仅带有Gregorian日历实现,即java.util.GregorianCalendar类。这是实例化GregorianCalendar`的方法:

Calendar calendar = new GregorianCalendar();

新的" GregorianCalendar"将日期和时间设置为"现在",这意味着创建日期和时间。

访问年,月,日等

"日历"类具有几种方法,可用于访问给定日期的年,月,日,时,分,秒,毫秒和时区。以下是一些示例,显示了如何完成此操作:

Calendar calendar = new GregorianCalendar();

int year       = calendar.get(Calendar.YEAR);
int month      = calendar.get(Calendar.MONTH); 
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // Jan = 0, not 1
int dayOfWeek  = calendar.get(Calendar.DAY_OF_WEEK);
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
int weekOfMonth= calendar.get(Calendar.WEEK_OF_MONTH);

int hour       = calendar.get(Calendar.HOUR);        // 12 hour clock
int hourOfDay  = calendar.get(Calendar.HOUR_OF_DAY); // 24 hour clock
int minute     = calendar.get(Calendar.MINUTE);
int second     = calendar.get(Calendar.SECOND);
int millisecond= calendar.get(Calendar.MILLISECOND);

我们还可以访问其他一些字段,例如" DAY_OF_WEEK_IN_MONTH"和" AM_PM",它们并不经常使用。查看官方JavaDoc,以了解有关这些领域的更多信息。

"日历"类具有相应的" set()"方法,因此我们也可以设置这些字段。看起来是这样的:

Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 24); // christmas eve

etc.

加,减年,月,日等

我们还可以添加到这些字段中,并使Calendar实例正确更新自身。看这个例子:

Calendar calendar = new GregorianCalendar();

//set date to last day of 2009
calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = december
calendar.set(Calendar.DAY_OF_MONTH, 31); // new years eve

//add one day
calendar.add(Calendar.DAY_OF_MONTH, 1);

//date is now jan. 1st 2010
int year       = calendar.get(Calendar.YEAR);  // now 2010
int month      = calendar.get(Calendar.MONTH); // now 0 (Jan = 0)
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // now 1

当执行日期算术(例如从给定日期添加或者减去年,月,日,小时等)时,add()方法非常方便。

要从字段中减去,请使用负值调用add()方法,如下所示:

calendar.add(Calendar.DAY_OF_MONTH, -1);

陷阱与容易弄错的地方

我们应该注意Calendar类中的一些小陷阱,以避免不必要的麻烦。我将在以下各节中介绍这些内容。

月陷阱

"日历"类的" MONTH"字段的范围从1到12不像我们在写日期时那样。相反,月份从0到11,其中0是一月,而11是12月。如果我们不了解这一点,可能会导致一些错误和随后的调试。

星期陷阱

如我们所料,星期几从1到7,但是星期天是星期日,而不是星期一。这意味着1 =星期日,2 =星期一,...,7 =星期六。这也使我不时感到烦恼。