Java8时间日期处理API解析

      Java 8之前的库对日期和时间的支持就非常不理想,之前项目中一般要处理日期都用的第三方的类库joda-time,Java 8中引入全新的日期和时间API就是要解决这一问题。公司新的项目使用的JDK版本为1.8,所以特意也尝试了下新版本的时间日期处理类。

   以前版本的Java我们主要依赖Date,Calender两个类来处理日期。不知道什么原因,设计者把年份的开始设置成从1900年开始,月份不是从1开始而是从0开始。比如下面这个例子:

Date date = new Date(2014, 11, 22);
// Tue Dec 22 00:00:00 CST 3914

本来想创建一个2014-11-22的日期,实际用这个api生成的是3914-12-22。

  后来在Java1.1版本sun公司推出了Calendar类, Calendar 类也有类似的问题和设计缺陷,导
致使用这些方法写出的代码非常容易出错。比如,月份依旧是从0开始计算(不过,至少 Calendar
类拿掉了由1900年开始计算年份这一设计)。

  幸运的是在Java8,这些问题都得到了解决,新的时间日期处理类借鉴了joda-time,甚至很多命名都是一样的。

  先来看一下Java几个比较重要的类的类图


  所有类都实现了 Temporal 接口, Temporal 接口定义了如何读取和操纵
为时间建模的对象的值。比如常用的方法有minus(减去多长时间),plus(加上一定的时间)

  LocalDate可以获得一个日期,只包含年月日。你可以通过静态工厂方法 of 创建一个 LocalDate 实例。 LocalDate 实例提供了多种方法来读取常用的值,比如年份、月份、星期几等,如下所示。

  

LocalDate date = LocalDate.of(2014, 11, 22);
System.out.println(date);
//2014-11-22
Month month = date.getMonth();
Era era = date.getEra();
System.out.println(era);
//NOVEMBER
//CE

//1970-1-1 加上一定天数后的日期
LocalDate localDate = LocalDate.ofEpochDay(1);
System.out.println(localDate);
//1970-01-02

LocalDate now = LocalDate.now();
System.out.println(now);
System.out.println(now.lengthOfMonth());
System.out.println(now.get(ChronoField.YEAR));
//2018-01-05, 31, 2018

LocalDate parseDate = LocalDate.parse("2019-02-28");

  LocalTime可以获得一个时分秒的时间

 LocalTime time = LocalTime.of(22, 23, 55);
        System.out.println(time);
        System.out.println(time.getHour());
        System.out.println(time.getMinute());
//        12:23:55
//        12
//        23

        LocalTime parseTime = LocalTime.parse("13:22:35");
        System.out.println(parseTime);
LocalDateTime则可以获得一个全格式的日期

        LocalDateTime dateTime = LocalDateTime.of(2018, 10, 23, 23, 28, 59);
        System.out.println(dateTime);
//        2018-10-23T23:28:59

实际上上面集中时间都是符合我们日常生活的时间格式,但计算机处理更多的是毫秒值,秒值这样的时间,这是我们可以用Instant

 Instant instant = Instant.ofEpochSecond(3);
        Instant instant1 = Instant.ofEpochSecond(2, 1000000000);
        Instant instant2 = Instant.ofEpochSecond(4, -1000000000);
        System.out.println(instant);
        System.out.println(instant1);
        System.out.println(instant2);
//        1970-01-01T00:00:03Z
//        1970-01-01T00:00:03Z
//        1970-01-01T00:00:03Z

其他类,表示两个LocalTime,LocalDateTime,Inastant之间间隔的Duration

LocalTime time1 = LocalTime.of(12, 13, 31);
LocalTime time2 = LocalTime.of(23, 12, 31);
Duration duration = Duration.between(time2, time1);
System.out.println(duration);
//PT10H59M
表示两个LocalDate之间间隔的要用Period,如果用duration会抛出异常

        final LocalDate date = LocalDate.of(2018, 8, 23);
        LocalDate now = LocalDate.now();
        Period period = Period.between(date, now);
        System.out.println(period);
//        P-7M-18D



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值