夏寿龙
侠客
侠客
  • UID507
  • 粉丝0
  • 关注0
  • 发帖数3
阅读:5069回复:0

代码中时间的获取和操作(Calendar类)

楼主#
更多 发布于:2019-05-25 21:04
Calendar类的简单使用

在日常开发过程中,经常需要对时间进行操作,获取到当前年月日时等数据。或是获得一个时间段的时间,例如某一个月的第一天和最后一天的时间区间、某一个星期的时间区间等。Java中提供了两种时间操作类,Date类和Calendar类。
jdk1.0版本中,使用Date类进行时间信息的操作,使用时需要创建实例Date date=new Date()。在jdk1.1版本之后,系统推荐使用Calendar类进行时间信息的操作,Date的许多方法都已经过时(不建议使用),并且在设计上Calendar类的功能也比Date类强大许多。Calendar类是一个抽象类,使用时用Calendar ca=Calendar.getInstance()即可获得当前时区下的时间对象。

以下是比较常用的一些Calendar类操作时间的方法和一些场景,并不一定是固定的方法,只提供一个思路。

1. 获取当前时间的年月日时分等信息
类似于Date类中的getTime()等方式,Calendar中提供了通用的get()方法来取对应的信息,如下所示(其中cNow表示建立的Calendar对象)。
Int year=cNow.get(Calendar.YEAR);
Int month=cNow.get(Calendar.MONTH);
Int day=cNow.get(Calendar.DAY_OF_MONTH);  //day_of_month表示当前月的日期号,day_of_year则表示在今年中的第几天
Int hour=cNow.get(Calendar.HOUR_OF_DAY);  //HOUR_OF_DAY表示当天的时数

上述的HOUR_OF_DAY等是Calendar的静态参数,了解其代表的意义即可取到对应的信息。


2. 获取当前时间前(或后)几天(几月)的时间
有时需要获得某一个时间的区间,或是需要进行时间转换时(例如世界时和北京标准时之间相差8小时等)。则使用Calendar类的add方法。如下所示。
cNow.add(Calendar.MONTH,x);   //其中x是一个int值,负数表示时间减,正数表示加
cNow.add(Calendar.HOUR_OF_DAY,x);

上面的HOUR_OF_DAY的意义同1节点中所述,这里需要注意的是,上面的cNow对象在进行add操作之后,其本身的值就变化了。比如2019-05-19 10:00:00通过add方法往前减了两小时后变成2019-05-19 08:00:00,若此时再对cNow对象减一小时的话,cNow对象代表的时间就变成了2019-05-19 07:00:00,这是开发过程容易忽略的点。
3. 获取当前周(当前月)第一天至最后一天的时间区间
Calendar cStart=Calendar.getInstance();
Calendar cEnd=Calendar.getInstance();

cStart.set(Calendar.DAY_OF_MONTH,1); //当前月第一天
cEnd.add(Calendar.MONTH,1);
cEnd.set(Calendar.DAY_OF_MONTH,1);
cEnd.add(Calendar.DAY_OF_MONTH,-1); //先把cEnd的值set为下月的第一天,然后减一天即为当前月的最后一天。


4. 获取某一个月的第一天到最后一天的时间
这里的思路同3节点中所描述的类似,区别在于将cStartcEnd的月值设置为你需要找出的月的值即可。
Calendar cStart=Calendar.getInstance();
Calendar cEnd=Calendar.getInstance();

//假设要找出6月的开始与结束日期
Int month=6;
cStart.set(Calendar.MONTH,month);
cEnd.set(Calendar.MONTH,month);

cStart.set(Calendar.DAY_OF_MONTH,1); //当前6月第一天
cEnd.add(Calendar.MONTH,1);
cEnd.set(Calendar.DAY_OF_MONTH,1);
cEnd.add(Calendar.DAY_OF_MONTH,-1); //先把cEnd的值set为下月的第一天,然后减一天即为当前月的最后一天。

5. 获取某个月某个周第一天到最后一天的时间
假设要取出5月第三周的第一天至最后一天的时间(7天)。
Int month=5,week=3;

Calendar cStart=Calendar.getInstance();
Calendar cEnd=Calendar.getInstance();

cStart.set(Calendar.MONTH,month);
cEnd.set(Calendar.MONTH,month);
cStart.set(Calendar.WEEK_OF_MONTH,week);
cEnd.set(Calendar.WEEK_OF_MONTH,week); //这四句语句将两个时间移到了5月的第三周中

cStart.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY);
cEnd.set(Calendar.DAY_OF_WEEK,Calendar.SATURDAY);
//这里就把这两个时间设置为了5月第三周的开始和结束时间了,但是这是以国际标准的星期天为一周开始,周六为一周结束的情况。若想按照周一为开始,周日为结束的话应该以下面这样。
int day_of_week = cal.get(Calendar. DAY_OF_WEEK) - 1;
if (day_of_week == 0 ) {
   day_of_week = 7 ;
}
cStart.add(Calendar.DATE , -day_of_week + 1 );
cEnd.add(Calendar.DATE , -day_of_week + 7 );

6. SimpleDateFormat类的使用
扩展内容,时间戳经常会和String字符串相互转换,这时候需要用到SimpleDateFormat类来进行转换。主要方法有两个。
SimpleDateFormat df=new SimpleDateFormat(yyyy-MM-dd HH:mm:ss);
df.parse(Str); //这里字符Str的格式标准需同上面的yyyy-MM-dd一致,否则会报错
df.format(Date); //这里为原始时间格式Date类型,与Calendar类可用getTime()方法转换
游客

返回顶部