设为首页 加入收藏

TOP

Java 时间类-Calendar、Date、LocalDate/LocalTime
2017-01-02 08:15:19 】 浏览:421
Tags:Java 时间 -Calendar Date LocalDate/LocalTime

  java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。


  1.1 Date的构造方法


  Date 是我们使用的最多的一个日期类,Date提供的构造方法在官方API中有一下几种:



  Date 类提供了多种构造方法,但是目前有很多方法都已经不建议使用


  目前我们可以通过使用:


  这两种方法创建对象的不同主要是通过指定的时间戳不同,通过设置Date 中的 fastTime 进行设置Date 对象的时间。


  除了使用构造方法获取实例,Date 还可以通过Instant 来创建一个Date 实例:


   Instant 是Java 8 提供的新特性:



  1.2 Date的常用方法


    Date 类中,提供了常用的获取:年,月,日,时,分,秒等方法:


    输出结果:


    读者可能会发现,这里的年份并不是我们想要的,这里主要是因为代码方法实现:



我们可以看到,这里的getYear 并不是获取当前年份,而是获取到和1900年的差值,这里主要是因为JDK老版本遗留下来的问题,对于Date 中获取年月日的方法,现在已经不建议使用了。


    Date类中也提供了一些设置日期的方法:



      与上面的get方法是一一对应的,但是现在也同样不建议使用了。


  1.3 Date的总结


    经过我们上述的分析,我们发现,Date 类如今很多方法已经没有什么用处了,确实,如今时间的处理并不直接在Date 类中进行,而是通过Calendar,或者LocalDate 来进行,我们再日常使用中,更多的是要来做一个记录日期的实例。


  介绍一下Date 与 Calendar 的区别


  Date用于记录某一个含日期的、精确到毫秒的时间。重点在代表一刹那的时间本身。
  Calendar用于将某一日期放到历法中的互动——时间和年、月、日、星期、上午、下午、夏令时等这些历法规定互相作用关系和互动。Calendar本身代表公历的一个简化缩水版,姑且叫“计算机历”。


  完整的公历是格里高利历,Java SE中以GregorianCalendar类来提供相关的历法功能。


  2.1 Calendar 的构造方法



    我们可以看到,Calendar 中的构造方法被封装在包中,我们无法直接通过构造方法来创建一个新的实例对象,我们只能通过调用 Calendar中的静态方法 Calendar.getInstance()方法获取一个实例对象。


    我们看一下官方API 中提供了哪些方法获取Calendar 对象:



    这是官方文档给出的获取去对象实例的方法,我们可以看到,我们可以通过指定TimeZoneLocale 来获取特定的 Calendar 对象,这也却分了每个地区的时间日历,方便开发者使用


    除了通过getInstance() 方法获取实例以外,Java 1.8 提供了一个内部类:



    我们可以通过创建一个Builder 的实体,然后通过调用Build 方法获取一个 Calendar 实例。


    在Builder 中,Builder 类提供了设置年月日的方法,可以通过设置时间,来获取特定的Calendar 对象。


    这里总结一下:


        Calendar 提供的获取实例的方法主要有两种途径:


          1、调用Calendar.getInstance()方法


          2、创建内部类Builder 的实例,通过调用其 build()方法创建 Calendar 实例


     对于第一种方法,只能先获取当前时间的Calendar,然后再通过调用相应的set 方法设置年月日等,而如果使用内部类Builder 方法,可以通过setInstant 方法设置我们所期望的时间。


  2.2 Calendar 的常用方法


    我们最常用的方法有:


    通过Calendar 方法获取一个Date 的实例。


    Calendar 方法获取年月日的方法:



  我们可以看到Calendar 里面获取年月日不像上面 Date 类中的通过访问各个方法来获取。


    Calendar 在初始化的时候,就已经将年月日划分好,并且存入fields 变量中。我们只需要传入个位置编号,就可以获取我们需要的信息


    除了获取以外,Calendar 也提供了相应的set 方法:


  


    通过重新传入参数,设置Calendar 的时间


    


    Calendar 获取当前月份,当前星期的最大\小天数


    提供了Before 和After 两个方法,用于判断当前时间与对比时间先后:



    


    提供了add 方法进行日期的加减


    2.3 Calendar 的总结


       从上面的分析我们可以看到,Calendar 类 主要是用于作为日历的对象,可以铜鼓哦设置地区时间,区分每个地区的日期,Calendar 提供的方法也没有很多对时间进行的一些操作。


      Java 8新增了LocalDateLocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了。


      java.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了。


      java.util.DateSimpleDateFormatter都不是线程安全的,而LocalDateLocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。


    3.1 LocalDate/LocalTime 的构造方法


      3.1.1 LocalDate 的构造方法:


        LocalDate 并没有提供公开的构造方法,只提供了一个封装的构造方法供内部使用。


      LocalDate 提供了三种创建实例的方法:


      


      3.1.2 LocalTime 的构造方法:


        LocalTime 与LcoalDate 一样,提供了一个封装的构造方法:


        LocalTime 提供了三种创建方法:


    3.2 LocalDate/LocalTime 的常用方法


      获取当天的起始时间:atStartOfDay()


      设置当前日期的时间:atTime()


      


      格式转换:format()



      常用的获取年、月、日 等方法


      获取改变月份的LocalDate :withMonth()


      其他常用的日期转换:


      3.3 LocalDate/LocalTime 的总结


      在新的Java 8中,日期和时间被明确划分为LocalDateLocalTimeLocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。


      新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇消息队列性能对比——ActiveMQ、R.. 下一篇深入Java虚拟机--判断对象存活状态

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目