Java的日期与时间
原文链接
作者:Jakob Jenkov
译者:阿为
目录:http://blog.csdn.net/tjgykhulj/article/details/68952451
(所有译者备注将以此形式出现,删除线表示有争议或不明确的地方
)
七、 java.util.Calendar和GregorianCalendar
Java中的java.util.Calendar
类适用于计算日期和时间,如果你不仅需要表达日期和时间,还需要一些其它功能,你可以尝试使用java.util.Calendar
。
java.util.Calendar
是一个抽象类,意味着你不能将其实例化。之所以要这样设计,是因为世界上有多种多样的日历,例如阿拉伯日历的起始年份就与Gregorian日历(即公历或新历)不同。
新建一个GregorianCalendar
Java只提供java.util.GregorianCalendar
这一种java.util.Calendar
的实现类,你何以直接新建出来使用:
Calendar calendar = new GregorianCalendar();
新建出来的calendar默认时间为当前时间,或者说创建出这个对象的时间。
访问年月日等信息
这个Calendar类有一系列方法,供你访问此对象的年、月、日、小时、毫秒以及时区。代码如下:
Calendar calendar = new GregorianCalendar();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); // 注意一月是0
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小时制
int hourOfDay = calendar.get(Calendar.HOUR_OF_DAY); // 24小时制
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等等。如果需要了解更多域,请查阅Java官方文档。
对应的,Calendar类还有一些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
对年月日等属性进行加减操作
你也可以直接在Calendar对象上进行加减,来更新它的值。举例如下:
Calendar calendar = new GregorianCalendar();
//set date to last day of 2009
calendar.set(Calendar.YEAR, 2009);
calendar.set(Calendar.MONTH, 11); // 11 = 十二月
calendar.set(Calendar.DAY_OF_MONTH, 31); // 表示09年最后一天
//再增加一天
calendar.add(Calendar.DAY_OF_MONTH, 1);
//现在日期变成了2010年1月1日了
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()方法可以准确无误的更新指定calendar的年月日,包括小时、分钟等等。减的操作也是一样的方法:
calendar.add(Calendar.DAY_OF_MONTH, -1);
易犯的错误
在Calendar类中有一些小陷阱,是你需要小心避免的,我会在之后的章节中提到,比如:
* 月份问题:在Calendar中MONTH这个域并不是从1到12的,而是从0表示一月,11表示十二月。如果稍不注意的话就要出bug了。
* 星期几问题:星期是如你预料的一般从1到7的,但是星期天才是一周的第1天,星期一是第2天,依次类推。这个设定总是都让我非常头大。
……
更新信息见JavaDoc文档
如果你需要做一些更复杂的日期时间计算,最好的方法是阅读JavaDoc上的java.util.Calendar
文档,其中有更多的关于计算的细节(比如将日期设为2009年1月34号,会出现什么结果?)