Java
的java.util.Calendar
用于日期和时间的运算。无论任何时候,只要你有一些轻微操作(除了仅仅表示日期和时间)需要执行,那么就使用这个类。(原文:Whenever you have something slightly more advanced than just representing a date and time, this is the class to use。)java.util.Calendar
类是抽象的,意味着你不能对其进行实例化。这么设计的原因是这个世界有着多个日历存在。
关于现行公历,转载维基的一段内容如下(地址在这):
现行公历(拉丁语:Calendarium Gregorianum,又称格里历,又译国瑞历、额我略历、格列高利历、格里高利历),是由意大利医生兼哲学家阿洛伊修斯·里利乌斯改革儒略历制定的历法,由教皇格列高利十三世在1582年颁行。公历是阳历的一种,于1912年开始在中国正式采用,取代传统使用的中国历法农历,而中国传统历法是一种阴阳历,因而公历在中文中又称阳历、西历、新历。格里历与儒略历一样,格里历也是每四年在2月底置一闰日,但格里历特别规定,除非能被400整除,所有的世纪年(能被100整除)都不设闰日;如此,每四百年,格里历仅有97个闰年,比儒略历减少3个闰年。)
实例化GregorianCalendar
Java
中只携带了格里历的实现,那就是java.util.GregorianCalendar
类,下面是一个你如何实例化GregorianCalendar
的例子:
Calendar calendar =
new
GregorianCalendar();
一个新的GregorianCalendar
有着被设置为当前时间点的日期和时间,表示这是由它所创建的。
获取年、月、日等
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);
// 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 小时制
int
hourOfDay = calendar.get(Calendar.HOUR_OF_DAY);// 24 小时制
int
minute = calendar.get(Calendar.MINUTE);
nt
second = calendar.get(Calendar.SECOND);
int
millisecond= calendar.get(Calendar.MILLISECOND);
你还可以访问更多的字段,比如不常用的DAY_OF_WEEK_IN_MONTH
和AM_PM
。你可以查阅官方的JavaDoc
了解这些字段的更多信息。Calendar
类有着对应的set
方法,因此你也可以对这些字段进行设置。下面是它长啥样的例子:
Calendar calendar =
new
GregorianCalendar();
calendar.set(Calendar.YEAR,
2009
);
calendar.set(Calendar.MONTH,
11
);
// 0-11 ,11 = 十二月
calendar.set(Calendar.DAY_OF_MONTH,
24
);
// 2009年12月24日
添加和减少年、月、日等
你也可以在这些字段上添加值并使得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
);
// 2009年12月31日
//add one day
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
方法是非常便利的。比如在一个给定的日期上添加或者减少年数、月数、天数、小时数等。
通过调用带有负值的add
方法在这些字段上减少值,比如:
calendar.add(Calendar.DAY_OF_MONTH, -
1
);
陷阱和误区
在Calendar
类中有一些小陷阱,你应该了解从而避免不必要的踩雷。
月份陷阱
Calendar
类的MONTH
字段并不像我们在其他地方写下日期般从1到12。取而代之的是月份从0走到11,0是1月,11是12月份。如果你不知道这个的话,它将会引发一点错误和随其而来的调试。
星期几误区
如你希望的那样,星期是从1走到7,但是每周的第一天是周六而不是周一。这意味着1 = sunday
, 2 = monday
, …, 7 = Saturday
。
JavaDoc中的更多细节
如果你需要做一些日期和时间的复杂运算,那么查阅官方Javadoc
的java.util.Calendar
文档是个不错的主意。类文档包含了更多关于该类的特性。举个例子假如你设置日期为2009年1月34日,那么真实的日期是什么呢?
转载自并发编程网 – ifeve.com本文链接地址: Java Date Time 教程-java.util.Calendar和GregorianCalendar