Java时间类Date全解析

一个抽象类中有成员方法,那么该如何调用?
思路:调用该抽象类中提供的返回值类型为该类类型的静态方法获取该类的实例,然后用该实例调用该抽象类中的成员方法。

获取时间:
System.currentTimeMills()方法,返回的是格林威治标准时间1970年1月1日8时至现在的毫秒数。
然后根据毫秒数来计算当前时间,但是计算距今多少年时多少月时比较复杂,因为存在闰年的情况,
在这种情况下,JDK从1.0版本开始就帮我们抽取出了一个类,这个类就是Date类,用来获取时间。
Date类:表示特定的瞬间,可以精确到毫秒,同时重写了toString()方法。Date类中提供了一些列
获取年,月,日,时,分,秒,以及毫秒的方法,但是这些方法不利于国际化,比如规定了周日为一天中的第0天,
月份也是从0开始,而年份更是减去了1990后的值,都是按照西方人的习惯,不利于国际化。
查看Date无参构造的底层源码实现发现:
Date date = new Date();
也是调用了有参的构造方法,返回的是从1970年1月1日8时到现在的毫秒数的偏移量所代表的时间格式。
Date date = new Date(System.currentTimeMills());
因为不利于实现国际化,因此从JDK 1.1开始这些方法都已经被废弃了,JDK不建议使用。
因此我总结:Date类的本质就是系统根据System.currentTimeMills()方法获取到格林威治标准时间到目前的毫秒数之后
按照西方人的习惯对该毫秒数进行相应的运算后封装了一些列获取年月日等的方法供我们调用,因此Date类其实也
可以看做是一个包装类,它是针对毫秒数所做的包装,但是不利于国际化。
还有就是Date类获取的时间因为存在闰秒而不是很准确,可能会在不同的计算机之间产生几秒的差别,
这主要取决于java虚拟机的主机环境。
因此基于以上两个原因,Date类不建议使用。

因此JDK 1.1之后JDK又给我们提供了两个抽象类:
A。获取具体的时间使用Calendar类,该类为抽象类,不可以直接new对象,
   但是该类有一个直接子类:GregorianCalendar(格林威治Calendar)。
B。格式化时间使用DateFormat类,该类也为抽象类。

------------------------------------------------------------------------------------------------
java.util.Calendar抽象类: ----------- 已知直接子类:GregorianCalendar
1.如何创建对象:
  已知Calendar类为一个抽象类,不能直接new对象,那么我们该如何获取一个抽象类的对象呢?
  1.使用父类的声明指向子类的实现
  2.通过调用该抽象类中提供的一个返回值为该类类型的静态方法获取该抽象类的一个实例,Calendar类中有没有这样的方法呢?
    答案是有,这个方法就是getInstance();
创建Calendar实例的两种方式:
  Calendar cal = new GregorianCalendar();//父类的声明指向子类的实现
  Calendar cal = Calendar.getInstance();//调用抽象类中提供的静态方法
2.创建好了对象之后如何获取具体的时间呢?
  通过调用cal对象的get(int a)方法来获取年月日信息,其中1代表年,2代表月,其他的查看API即可。
  如获取当前的年份可以:cal.get(1);或者cal.get(Calendar.YEAR);cal.get(2);或者cal.get(Calendar.MONTH);
  上面所说的1,2等是Calendar类帮我们封装的一些静态常量所代表的值,1代表年,2代表月。
但是Calendar类存在安全隐患,即存在bug:
  我们知道get方法接受的参数为int类型的,但是我们使用传入10000作为参数时运行就会报错,原因是该类是JDK 1.1之后
  系统帮提供的获取时间的类,并将一些常用的字段进行了封装,并为这些字段提供了初始int值,如字段YEAR的值为1,
  MONTH的值为2等,但是字段的个数也是有限的,而10000并没有对应的字段,因此运行时就会报错。
  那么我们如何修复这个bug呢?答案是使用枚举。
  枚举的出现主要是用来定义常量的,在枚举出现之前定义常量都是使用接口或者抽象类,但是存在上述的安全隐患,所以才出现了枚举。
---------------------------------------------------------------------------------------------------------------------------
java.text.DateFormat抽象类:---------- 已知直接子类:SimpleDateFormat
作用:将日期转换为指定的字符串表示形式和将字符串表示的时间格式转换为时间对象。
使用场景:例如:1。封装的Person类有一个出生日期属性,我们要以字符串形式输出该日期。
               2。获取的注册的用户填写的时间为字符串,而服务器端的时间定义为Date类型,那么在传值时就要对字符串进行转换为时间对象。

1.如何创建DateFormat的对象?
  DateFormat format = new SimpleDateFormat();//父类的声明指向子类的实现
  
2.如何将日期转换为指定字符串和将指定字符串转换为日期对象?如转换为:2016年08月01日

  String patten = "yyyy年MM月dd日";
  DateFormat format1 = new SimpleDateFormat(patten);
  String time = format1.format(new Date()); 
  System.out.println(time);
  Date date = format1.parse("2016年10月21日");
  System.out.println(date);
----注意:
 1.在将字符串转换为Date对象时,时间字符串的格式必须符合创建format1对象时自定义的时间字符串格式,否则运行时会报错。
   如:format1.parse("2016年10月21号");//就会报错
 2.如果在创建format1对象时使用的是SimpleDateFormat无参的构造方法,那么默认将当前日期转换为当前语言环境支持的字符串格式,
   同样在解析式,字符串格式要符合该格式才能转换为Date对象。

以上将日期和字符串进行转换的方式JDK不建议我们使用,而是建议我们使用如下的方式:
//API建议使用的转换方式

//此处使用了父类的下转型,因为aoolyPattern()方法是子类特有的方法,所以要调用必须向下转型。
SimpleDateFormat format3 = (SimpleDateFormat)DateFormat.getDateInstance();
//创建格式化字符串
String pattern = "yyyy 年 MM 月 dd号";
//覆盖默认的字符串格式
dateFormat3.applyPattern(pattern);
//进行转换
String time = dateFormat3.format(new Date());

-----------------------------------------------------------------------------------------------------
完毕!!!!!!!!!!!!!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智玲君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值