设为首页 加入收藏

TOP

Java 8新特性之新的日期和时间API(一)
2018-11-20 22:09:43 】 浏览:380
Tags:Java 特性 日期 时间 API

在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。这个类只能以毫秒的精度表示时间。这个类还有很多糟糕的问题,比如年份的起始选择是1900年,月份的起始从0开始。这意味着你要想表示2018年8月22日,就必须创建下面这样的Date实例:


Date date = new Date (118,7,22);


Wed Aug 22 00:00:00 CST 2018


甚至Date类的toString方法返回的字符串也容易误人。现在这个返回值甚至还包含了JVM的默认时区CST,但这不表示Date类在任何方面支持时区。


Java 1.1中,Date类中的很多方法被废弃了,取而代之的是java.util.Calendar类。但是Calendar也有类似的问题和设计缺陷,导致使用这些方法写出的代码非常容易出错。比如月份依旧是从0开始计算,不过去掉了1900年开始计算年份这一设计。更糟的是同时存在Date和Calendar这两个类,也增加了程序员的困惑。到底该使用哪一个类呢?此外,有的特性只有在某一个类有提供,比如用于以语言无关方式格式化和解析日期或时间的DateFormat方法就只有在Date类里有。


DateFormat也有它自己的问题,首先他不是县城安全的。这意味着两个县城如果尝试使用同一个formatter解析日期,你可能无法得到预期的结果。


最后,Date和Calendar类都是可变的。


Java 8 在java.time包中整合了很多Joda-Time的特性,java.time包中提供了很多新的类可以帮助你解决问题:LocalDate、LocalTime、Instant、Duration和Period。


LocalDate


首先该类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间。另外,它也不附带任何时区相关的信息。 你可以通过静态工厂of创建一个LocalDate实例,LocalDate提供了很多方法来读取常用的值,比如年月日星期几等:


        LocalDate date = LocalDate.of(2018,8,22);
        int year = date.getYear(); //2018
        Month month = date.getMonth(); //AUGUST(7)
        int day = date.getDayOfMonth(); //22
        DayOfWeek dow = date.getDayOfWeek(); //WEDNESDAY
        int len = date.lengthOfMonth(); //31
        boolean leap = date.isLeapYear(); //false


        LocalDate today = LocalDate.now(); //2018-08-22


传递TemporalField参数给 date的get方法也可以拿到同样的信息,TemporalField是一个借口,它定义了如何访问temporal对象某个字段的值。ChronoField枚举实现了这一借口,所以你可以很方便的使用get方法得到枚举元素的值:


        int yearofGet = date.get(ChronoField.YEAR); //2018
        int monthofGet = date.get(ChronoField.MONTH_OF_YEAR); //8
        int dayofGet = date.get(ChronoField.DAY_OF_MONTH); //22


LocalTime


与LocalDate类似,LocalTime表示时间,你可以使用of重载的两个工厂方法创建LocalTime实例,第一个重载是小时和分钟,第二个重载还接受秒。也提供了getter方法访问这些变量的值:


        LocalTime time = LocalTime.of(17,55,55);
        int hour = time.getHour();//17
        int minute = time.getMinute();//55
        int second = time.getSecond();//55


 


LocalDate和LocalTime都支持从字符串创建,使用静态方法parse:


        LocalDate dateofString = LocalDate.parse("2018-08-22");
        LocalTime timeofString = LocalTime.parse("15:53:52");


如果格式不正确,无法被解析成合法的LocalDate或LocalTime对象。parse方法会抛出一个继承自RuntimeException的DateTimeParseException异常。


LocalDateTime


这个复合类是LocalDate何LocalTime的合体,同时表示了日期和时间。但不带有时区信息,你可以直接创建,也可以通过合并日期和时间对象构造。


        LocalDateTime dt1 = dateofString.atTime(timeofString);
        LocalDateTime dt2 = time.atDate(date);
        LocalDateTime dt3 = LocalDateTime.of(date,time);
        LocalDateTime dt4 = LocalDateTime.of(2018,8,22,17,55,55);
        //2018-08-22T17:55:55


也可以将LocalDateTime拆分为独立的LocalDate 和LocalTime:


        LocalDate localDate = dt1.toLocalDate();
        LocalTime localTime = dt1.toLocalTime();


Instant


作为人,我们习惯于星期几、几号、几点、几分这样的方式理解日期和时间,但是对于计算机而言并不容易理解。java.time.Instant类对时间的建模方式是 以Unix元年时间(UTC时区1970年1月1日午夜时分)开始

首页 上一页 1 2 3 4 5 下一页 尾页 1/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java 8新特性之CompletableFuture.. 下一篇Java 8新特性之Optional取代null

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目