处理日期的工具类及其使用方法总结(Date,SimpleDateFormat,Calendar的区别和联系以及应用)

一:Date类

Date日期类。Date表示特定的瞬间,他精确到毫秒。需要特别注意的是,由于有些函数的API不易实现国际化,所以这些函数但部分都已经被Calendar类所取代。来看一下Date类的应用:
1:获取系统当前的时间(对象),(或者获取的服务器的时间):

Date date = new Date();
System.out.println(date);//输出结果为:Wed Jul 18 17:50:03 CST 2018

2:使用Date类中保留的为数不多的方法getTime()将时间转换成毫秒数(常用于计算!):
(注意:输出的毫秒数是1970年1月1日00:00:00GMT以来此Date对象表示的毫秒数)

Date date = new Date();
long res = date.getTime();
System.out.println(res);//输出结果为:1531907274824

3:使用构造方法将毫秒转日期。

//注意默认类型是int,后面加上L可以将这个数据转换成long类型      
long a = 1531907274824L;
Date date = new Date(a);
System.out.println(date);//输出结果为:Wed Jul 18 17:47:54 CST 2018

二:SimpleDateFormat类

SimpleDateFormat是一个具体类,它能够格式化和解析日期,他允许格式化(日期转换成String),解析(String转换成日期格式),还有就是可以进行日期的规范化操作。
需要特别注意的是,SimpleDateFormat类在进行时间日期格式化的时候,他的括号内给定的格式化模式需要特别注意大小写yyyy-MM-dd注意,当y写成Y的时候,会出现时间上的错位(亲测会出错!)

1:解析(String转换成Date)

SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
         String t1 = "2018-10-18";
          String t2 = "2019-3-3";
          Date time1 = sdf1.parse(t1);
          Date time2 = sdf1.parse(t2);
          long res =time2.getTime()-time1.getTime();
          int re = (int) (res/1000/60/60/24);
          System.out.println(re);

分析:此类的对象sdf1 中的方法parse可以将String类型的数据转换成Date类型的数据,同时Date类型的数据可以使用getTime方法将各自时间所代表的毫秒数提取出来,并且进行相减,得出相应的毫秒数,使用毫秒数就可以计算出相应的差距天数。SimpleDateFormat这个类中的方法可以和Date类中的方法进行组合计算出两个String类型的日期的相差天数。(注意String型的日期格式必须符合sdf1对象设定的格式)

2:格式化日期

Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String sd = sdf.format(d);
System.out.println(sd);

分析:使用Date对象获取系统当前的时间他的时间显示的形式为:Wed Jul 18 17:50:03 CST 2018。此时需要对这个Date类型的数据进行格式化显示,要使用到SimpleDateFormat类型的数据进行格式化,首先设定格式化的形式,随后使用format方法对Date对象进行格式化一定要注意的是此时的格式化之后返回值是一个String类型的数据,如果再想转换成Date类型的数据就需要使用parse方法进行解析转换成Date对象。

三:Calendar类

Calendar类也称为日历类,他是一个抽象类,抽象类是不能被实例化的,所以他就不能使用new的方式来创建一个抽象类,Calendar类只能通过使用工厂方法getInstance()才能创建一个他的子类GregorianCalendar的对象,并且赋值给抽象父类的变量(此处使用到了多态)。
Calendar类多用于去提取日历中的具体的字段。或者进行设置相应的日历字段。
1:创建Calendar对象

Calendar c = Calendar.getInstance();

2:输出Calendar日历对象c

Calendar c = Calendar.getInstance();
System.out.println(c);

输出的结果是:
java.util.GregorianCalendar[time=1532400606110,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=”Asia/Shanghai”,offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2018,MONTH=6,WEEK_OF_YEAR=30,WEEK_OF_MONTH=4,DAY_OF_MONTH=24,DAY_OF_YEAR=205,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=50,SECOND=6,MILLISECOND=110,ZONE_OFFSET=28800000,DST_OFFSET=0]
分析:我们可以看出这个日历类对象获取到当前系统时间,转换成日历的形式进行输出,首先说明一下当前系统时间为2018-07-24.其中MONTH=6不是六月的意思,在Calendar类中月份是从0开始的0-11,11就代表是12月,0代表是1月。DAY_OF_WEEK=3,不是周三的意思,接下来将会详细介绍日历类。

3:获取Calendar日历类对象的指定字段的值
1)获取年份

Calendar c = Calendar.getInstance();
int a=c.get(c.YEAR);
System.out.println(a);//输出结果为2018

int b = c.YEAR;
System.out.println(b);//输出结果为1

分析:Calendar类中的get(int a)方法;这里的int a是给定的日历字段,方法的返回值是给定日历字段的值。此处由于要查找的是日历中的年,所以使用”c.YEAR”或者是”Calendar.YEAR”他的返回值是1,所以带入得出c.get(1)得出指定日历字段的值为2018.【此处应该查找的是日历对象中字段为1的值】。
注意:这里的YEAR是一个常量值,使用反编译工具进入clss文件中截图显示这些常量的值:
这里写图片描述

2)获取月份

Calendar c = Calendar.getInstance();
int a=c.get(c.MONTH)+1;
System.out.println(a);//输出值为7

int b = c.MONTH;
System.out.println(b);//输出值为2

分析:在Calendar类中月份是从0开始到11结束的,所以采用c.get(c.MONTH)输出的值总会比实际的月份小1,所以应当加上1才能得出实际的月份。

3)获取具体的天数。

Calendar c = Calendar.getInstance();
int a=c.get(c.DAY_OF_MONTH);//或者是c.get(c.DATE)
System.out.println(a);//输出24

int b = c.DAY_OF_MONTH;
System.out.println(b);//输出5

分析:返回的是本月的第几天,用常量DATE或者DAY_OF_MONTH来指定日历字段。

4)获取指定日期的周X

Calendar c = Calendar.getInstance();
int index = c.get(Calendar.DAY_OF_WEEK);
System.out.println(index);//输出3
String[] week = {"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
System.out.println(week[index-1]);//输出星期二

分析:使用Calendar.DAY_OF_WEEK得出具体字段为7,找到日历中的对应的字段值,即调用方法c.get(7)得出来指定字段为3。又因为Calendar类中day_of_week是从星期天开始计算的,所以实际的天数应当比日历中的对应的字段值小1,故应当使用数组进行定位显示week[index-1];得出来今日是星期二。

4:设置Calendar类指定的字段值和常用方法
1)使用add方法为指定日历字段添加或者减去指定的时间量
add(int a,int b):int a代表的是指定的日历字段,int b代表的是要变化的时间量;返回值为void。

Calendar c = Calendar.getInstance();

System.out.println(c.get(c.MONTH)+1);//输出7
System.out.println(c.get(c.DAY_OF_MONTH));//输出24

c.add(Calendar.DAY_OF_MONTH, 10);

System.out.println(c.get(c.MONTH)+1);//输出8
System.out.println(c.get(c.DAY_OF_MONTH));//输出3

分析:使用add方法,为DAY_OF_MONTH字段添加十天,从24号的基础上加上十天,同时月份进1。

2)使用getTime方法获取Date对象

注意:要区别好Date对象的getTime方法,和Calendar对象的getTime方法;前者返回的Date对象的毫秒数,后者是将一个Calendar对象返回成一个Date对象。

Calendar c = Calendar.getInstance();
Date date = c.getTime();
System.out.println(date);//输出Tue Jul 24 22:21:00 CST 2018

分析:注意此时的Date对象是未经格式化的,要想进行格式化需要使用SimpleDateFormat类进行格式化。

3)使用setTime(Date date)方法
对指定的Calendar对象设置相应的Date。即把Date对象赋给Calendar对象。

Calendar c = Calendar.getInstance();
Date date = new Date(1531907274824L);//将2018-07-18的毫秒数变成Date对象
c.setTime(date);
System.out.println(c.get(c.DAY_OF_MONTH));//输出18

分析:将Date对象使用方法转换成Calendar对象之后,输出天数得出为18号,验证无误。

4)使用set()方法为指定日历字段进行赋值
**注意:**set方法有4个重载的方法,应该查看API进行使用。

Calendar c = Calendar.getInstance();

c.set(c.YEAR, 2017);//为YEAR字段 添加指定的值2017
System.out.println(c.get(c.YEAR));//输出2017

c.set(c.MONTH, 5);//为MONTH字段设置为六月,因为月份是从0开始的所以设置为5
System.out.println(c.get(c.MONTH)+1);//最后必须要加上1,理由前边已解释

c.set(c.DAY_OF_WEEK, 3);
System.out.println(c.get(c.DAY_OF_WEEK));//3
int index = c.get(c.DAY_OF_WEEK);
String[] week = {"星期天","星期一","星期二","星期三","星期四","星期五","星期六"};
System.out.println(week[index-1]);//输出星期二

分析:应当特别注意月份和DAY_OF_WEEK的设置。

总结:

1:Date类和Calendar类都能获取系统当前的时间,但是后者是一个抽象类不能使用new方法创建对象;
2:SimpleDateFormat类多用于格式化时间,它能够将String类型的时间转换成Date对象,也能够将一个Date对象格式化为一个String类型的时间。
3:Date类中的getTime方法能够将时间转换成毫秒,而Calendar类中的getTime方法能够将Calendar对象转换成Date对象。
4:要特别注意Calendar类中的月份和DAY_OF_WEEK的不同之处,前者是从0开始到11结束,所以需要将get出来的字段值+1,才是现实生活中的月份数;而后者是一个数组,数组是从星期天开始进行排列的,所以获取的字段值应该再-1然后通过数组进行便于读者的阅读的DAY_OF_WEEK输出。

猜你喜欢

转载自blog.csdn.net/sun_DongLiang/article/details/81102750