Java的java.util.Calendar和GregorianCalendar
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 =星期六。这也使我不时感到烦恼。