在JAVA中有两个日期类Date类和Calendar类,在开始的时候只有Date类来表示日期。后来出现了Calendar类对Date类开始替代,由Calendar类来对日期进行计算,之后Date类中的很多方法已经废弃不用,但是两者都是时间表示类。
两者主要区别:java.util.Date是个日期数据,java.util.Calendar 用于日期相关的计算。
具体区别:
Date:
- Date表示特定的瞬间,精确到毫秒。它允许把日期解释为年、月、日、小时、分钟和秒值;它也允许格式化和解析日期字符串。现在一般只用来当做时间数据表示类。
Calendar:
- Calendar类是一个抽象类,里边提供了很多操作日历字段的方法(YEAR、MONTH、DAY_OF_MONTH、HOUR),也就是对日期时间进行计算。
- Calendar类因为是抽象类无法直接创建对象使用,但是它有一个静态方法叫getInstance(),该方法返回了Calendar类的子类对象,该方法是使用默认时区和语言环境获得一个日历,也就是获得当前系统时间。
两者获得当前时间代码示例:
//Calendar类获得当前时间
Calendar calendar=Calendar.getInstance();
//Date类获得当前时间
Date date=new Date();
System.out.println("Calendar表示的当前时间:"+calendar);
System.out.println("Date表示的当前时间:"+date);
输出结果:
由此输出的结果可以看到Calendar和Date的区别,Date输出的是一个日期时间表示,而Calendar输出的是一个对象,里面有各种日期数据。
所以如果要用Calendar来输出一个日期时间,只要用gettime()方法获取就行了。而两者转换成时间戳的方法都是gettime(),只不过calendar要在gettime()方法获得时间后再调用gettime()方法才能把日期钻换成时间戳。
Date和Calendar相互转换
主要是通过Calendar类的setTime和getTime方法。setTime方法是Calendar类接收一个Date类型的参数,getTime方法是返回一个Date类型的结果。
Date date = new Date();
Calendar calendar = Calendar.getInstance();
//Date转为Calendar
calendar1.setTime(date);
//Calendar转为Date
Date date = calendar.getTime();
下面介绍Calendar对日期的一些操作
1.指定一个日期(年月日,时分秒)
使用Calendar的set(int year, int month, int date, int hourOfDay, int minute,int second)方法。
set还有其他的重载方法,如果只设定年月日等,没设定的其他日期数据如时分秒,默认用当前系统时间填充。
//Calendar类获得实例对象
Calendar calendar=Calendar.getInstance();
//设置指定时间,年月入,时分秒
calendar.set(2020,1,9,16,55,33);
System.out.println(calendar.getTime());
输出:
还可以用Calendar的 set(int field, int value) 方法来指定日期
field 表示时间量,它的值可以如下:
-
Calendar.ERA:表示无加减
-
Calendar.YEAR:年
-
Calendar.MONTH:月
-
Calendar.DATE:日
-
Calendar.HOUR:小时
-
Calendar.MINUTE:分钟
-
Calendar.SECOND:秒
除了上述7个以外,field参数还可以是Calendar中所有的常量。如 Calendar.DAY_OF_MONTH,Calendar.WEEK_OF_MONTH,DAY_OF_WEEK等。然后这个参数要是和周相关,那后面的value参数就是周为单位(一年中的第几周,一个月中的第几周)。同理,和日相关,后面的value参数就以日位单位(一个月中的第几日,一年中的第几日,一周的第几日),和小时相关,后面的value参数就以小时为单位(一天中的第几小时)。
value 表示要对这个时间(年份或者月份等)设置的数值,类型为整数。
示例:
//Calendar类获得实例对象
Calendar calendar=Calendar.getInstance();
//设置日期的天数为这个月的第18天
calendar.set(Calendar.DAY_OF_MONTH,18);
//设置日期的小时为0
calendar.set(Calendar.HOUR_OF_DAY,0);
//设置日期的分钟为0
calendar.set(Calendar.MINUTE,0);
//设置日期的秒为0
calendar.set(Calendar.SECOND,0);
//设置日期的毫秒为0
calendar.set(Calendar.MILLISECOND,0);
//其他没设置的日期的年份和月份 就是默认设置系统当前的了
System.out.println(calendar.getTime());
输出结果:
这里我的系统时间是2020年1月8日,所以默认的时间年份是2020年,月份是1月份。
2.对指定的日期进行操作,增加减少等
使用Calendar的 add(int field, int amount) 方法来指定日期,field参数和上面的set(int field, int value) 方法中的field参数一样。amount为正,则是增加,amount为负则是减少。
示例:
//Calendar类获得实例对象
Calendar calendar=Calendar.getInstance();
System.out.println("当前时间:"+calendar.getTime());
//日加5天
calendar.add(Calendar.DAY_OF_MONTH,5);
//月份增加10
calendar.add(Calendar.MONTH,10);
//年份减少1
calendar.add(Calendar.YEAR,-1);
System.out.println("对日期进行加减后的时间:"+calendar.getTime());
输出结果:
把时间转换成特定的格式
使用SimpleDateFormat转换
SimpleDateFormat是时间简单格式化,可以把Date类型换成特定的String类型,也可以把String格式类型转换成Date类型。所以如果要转换Calendar的时候先把Calendar转换成Date类型。
Date类型转换成特定的时间格式数据(String类型):
//定义了一个简单的格式转换类,转换的格式是 年份-月份-日期 时:分:秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//Calendar类获得实例对象
Calendar calendar=Calendar.getInstance();
System.out.println("当前时间未转换特定格式:"+calendar.getTime());
//这里calendar.getTime()就是把Calendar类型转换成了 Date类型
String date=sdf.format(calendar.getTime());
System.out.println("对当前时间进行了格式转换:"+date);
输出结果:
特定的时间格式数据(String类型)转换成Date类型:
//定义了一个简单的格式转换类,转换的格式是 年份-月份-日期 时:分:秒
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//定义一个时间格式的字符串
String date="1998-02-08 11:55:33";
System.out.println("字符串输出:"+date);
//把该时间格式的字符串转换成Date日期类型
Date d=sdf.parse(date);
System.out.println("把字符串转换成Date日期类型:"+d);
输出结果:
注:SimpleDateFormat是线程不安全的,所以建议在用到的时候新建一个实例对象。不要使用共享对象,要转变为局部私有对象使用,把共享对象转变为局部私有后就能避免线程不安全问题。虽然会加重创建对象的负担,但是一般情况下性能影响不大。