前言
时间的处理在Java中会经常用到,Java中常用的时间处理类有如下两种:
- Date:
日期类
- 用来表示瞬时时间,精确到毫秒,他表示的是某一刹那的时间。Date不存在时区概念。
- 由于Date类不易于实现国际化,所以逐渐不被推荐使用,并且废弃了大部分方法。
- Calendar:
日历类
,可以理解为计算机历- 一方面是为了弥补Date的国际化缺陷,另一方面是将时间以日历的形式来表示和处理
- Calendar包含时区和语言的概念
- Calendar将时间细分成了
年月日时分秒毫秒上午下午夏时令等
概念,并提供这些概念的相关操作方法。
下面我们来康康这两个工具类的一些常用方法。
Date 📅
Date类位于
java.util
包下,是JDK中最早的时间处理类,但由于Date类不易于实现国际化,后不被推荐使用。Date源自于JDK1.0,到如今Date类中的大部分构造函数和方法都已经废弃不推荐使用(
Deprecated
)
目前还在使用的方法如下:
方法 : 返回值 | 参数说明 | 功能 |
---|---|---|
Date() | 构造器 | 当前时间的Date对象 |
Date(long date) | 构造器,date :与GMT1970年1月1日00:00:00之间的时间差(ms) |
创建指定时间的Date对象 |
after(Date when):boolean | when :待判断的Date对象 |
某一Date是否在when之后 |
before(Date when):boolean | when :待判断的Date对象 |
某一Date是否在when之前 |
compareTo(Date anotherDate):int | anotherDate :待比较的Date对象 |
Date对象与参数中的Date进行比较 ,a.compareTo(b) :a>b:正数 , a=b:0 ,a<b:负数 |
getTime():long | 返回Date对象的时间戳 | |
setTime(long time):void | time :时间戳 |
设置Date对象的时间 |
Date对象的使用示例如下
1 | import java.util.Date; |
Calendar 📆
在JDK1.1后,处理时间时,推荐使用
Calendar
类,Calendar包含Date中所有的功能,并且比Date更复杂更强大。Calendar是一个抽象类,不可以直接实例化它,但可以通过他提供的
getInstance
方法进行创建
Calendar类在Date原有功能基础上,加强了对时间的处理和自定义等。其常用方法如下:
方法 : 返回值 | 参数说明 | 功能 |
---|---|---|
getInstance():Calendar | 对外提供Calendar的创建入口 (该方法还有 两个重载方法 ,主要用于自定义时区,语言环境) |
|
after(Object when):boolean | when :待判断的Calendar对象 |
某一Date是否在when之后 |
before(Object when):boolean | when :待判断的Calendar对象 |
某一Date是否在when之前 |
compareTo(Calendar a):int | a :待比较的Calendar对象 |
Date对象与参数中的Date进行比较 ,a.compareTo(b) :a>b:正数 , a=b:0 ,a<b:负数 |
getTime():Date | 将Calendar日期对象转换为Date对象 | |
setTime(Date date):void | date :Date对象 |
将Date对象表示的时间值设置给Calendar日期对象 |
getTimeInMillis():long | 返回Calendar日期对象的时间戳 | |
setTimeInMillis(long millis):void | millis :时间戳 |
用给定long值设置日历的当前时间 |
get(int field):int | field :日历字段(Calendar.YEAR) |
获取指定日历字段的值 |
set(int field, int val):void | field :日历字段,val :具体值 |
设置日历字段的值 |
add(int field, int amount):void | field :日历字段,amount :加减值 |
基于日历的规则实现日期加减。amout可为负数 |
roll(int field, boolean up):void | field :日历字段,up :T加/F减 |
在指定日历字段上添加或减去1个时间单元 |
roll(int field, int amount):void | field :日历字段,amount :加减值 |
在指定日历字段上添加或减去指定的时间单元 |
以上仅仅是Calendar类中的一部分常用方法,更多详细的方法大家可以参考源码
Calendar类是基于日历的时间处理类,在使用他之前需要注意下面一些小细节:
-
Calendar.MONTH
: 初始值为0,最大值11,所以在格式化时间时记得+1
-
在使用set方法时,
Calendar.HOUR
为12小时制,Calendar.HOUR_OF_DAY
为24小时制 -
add与roll都可以实现指定字段的加减,两者的区别在于add会进位而roll不会,例子如下:
1
2
3
4
5
6
7
8//add与roll的区别
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar ca1 = Calendar.getInstance();//2019-11-21 16:24:31
Calendar ca2 = Calendar.getInstance();//2019-11-21 16:24:31
ca1.add(Calendar.MONTH,3);//add加3个月
ca2.roll(Calendar.MONTH,3);//roll加3个月
System.out.println(sf.format(ca1.getTime()));//进位:2020-02-21 16:24:31
System.out.println(sf.format(ca2.getTime()));//不进位:2019-02-21 16:24:31
Calendar类的常用方法使用示例如下:
add
1 |
|
set
1 | //set:设置日历字段的值 |
get
1 | //get:返回指定日历字段的值 |
总结
本文主要对时间处理类进行了方法梳理和说明,实际的使用中还会掺杂着时区和时间格式化等操作。
下篇文章我们接着来了解下Java中时区类TimeZone的基本使用。