Java的日期与时间(七)java.util.Calendar和GregorianCalendar

17 篇文章 0 订阅

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号,会出现什么结果?)


下一章:java.util.TimeZone

package com.hexiang.utils; import java.text.SimpleDateFormat; import java.util.*; public class CalendarUtil { public static void main(String args[]) { System.out.println("First day of week is : " + new SimpleDateFormat("yyyy-MM-dd") .format(getFirstDateByWeek(new Date()))); System.out.println("Last day of week is : " + new SimpleDateFormat("yyyy-MM-dd") .format(getLastDateByWeek(new Date()))); System.out.println("First day of month is : " + new SimpleDateFormat("yyyy-MM-dd") .format(getFirstDateByMonth(new Date()))); System.out.println("Last day of month is : " + new SimpleDateFormat("yyyy-MM-dd") .format(getLastDateByMonth(new Date()))); } /** * 获得所在星期的第一天 */ public static Date getFirstDateByWeek(Date date) { Calendar now = Calendar.getInstance(); now.setTime(date); int today = now.get(Calendar.DAY_OF_WEEK); int first_day_of_week = now.get(Calendar.DATE) + 2 - today; // 星期一 now.set(Calendar.DATE, first_day_of_week); return now.getTime(); } /** * 获得所在星期的最后一天 */ public static Date getLastDateByWeek(Date date) { Calendar now = Calendar.getInstance(); now.setTime(date); int today = now.get(Calendar.DAY_OF_WEEK); int first_day_of_week = now.get(Calendar.DATE) + 2 - today; // 星期一 int last_day_of_week = first_day_of_week + 6; // 星期日 now.set(Calendar.DATE, last_day_of_week); return now.getTime(); } /** * 获得所在月份的最后一天 * @param 当前月份所在的时间 * @return 月份的最后一天 */ public static Date getLastDateByMonth(Date date) { Calendar now = Calendar.getInstance(); now.setTime(date); now.set(Calendar.MONTH, now.get(Calendar.MONTH) + 1); now.set(Calendar.DATE, 1); now.set(Calendar.DATE, now.get(Calendar.DATE) - 1); now.set(Calendar.HOUR, 11); now.set(Calendar.MINUTE, 59); now.set(Calendar.SECOND, 59); return now.getTime(); } /** * 获得所在月份的第一天 * @param 当前月份所在的时间 * @return 月份的第一天 */ public static Date getFirstDateByMonth(Date date) { Calendar now = Calendar.getInstance(); now.setTime(date); now.set(Calendar.DATE, 0); now.set(Calendar.HOUR, 12); now.set(Calendar.MINUTE, 0); now.set(Calendar.SECOND, 0); return now.getTime(); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值