Java8---新的日期和时间API

Java8以前时间和日期api存在的问题:

在Java 1.0 中,对日期和时间的支持只能依赖java.util.Date 类,这个类无法表示日期,只能以毫秒的精度表示时间。

比如:年份的起始选择是1900 年,月份的起始从0 开始。这意味着,如果你想要用Date 表示Java 9 的发布日期,即2017 年9 月21 日,

需要创建下面这样的Date 实例:

Date date = new Date(117, 8, 21);
它的打印输出效果为:
Thu Sep 21 00:00:00 CET 2017

在Java 1.1 中,Date 类中的很多方法被废弃了,取而代之的是java.util.Calendar 类,Calendar 类也有类似的问题和设计缺陷月份依旧是从0 开始计算

(不过,至少Calendar 类去掉了由1900 年开始计算年份这一设计)

有的特性只在某一个类中提供,比如用于以语言无关方式格式化和解析日期或时间的DateFormat 方法就只在Date 类里有。

使用LocalDate 和LocalTime

LocalDate 类的实例是一个不可变对象,它只提供了简单的日期,并不含当天的时间信息。另外,它也不附带任何与时区相关的信息。

LocalDate date = LocalDate.of(2017, 9, 21);//2017-09-21
int year = date.getYear();                           //2017
Month month = date.getMonth();                //SEPTEMBER 
int day = date.getDayOfMonth();                //21
DayOfWeek dow = date.getDayOfWeek();    //THURSDAY
int len = date.lengthOfMonth();                   //30
boolean leap = date.isLeapYear();                //false

  可以使用工厂方法now 从系统时钟中获取当前的日期:

LocalDate today = LocalDate.now();

  而LocalTime是一个不可变的对象,表示一个没有日期信息的时间。

LocalTime time = LocalTime.of(13, 45, 20);
int hour = time.getHour();
int minute = time.getMinute();
int second = time.getSecond();

  LocalDate 和LocalTime 都可以通过解析代表它们的字符串创建。使用静态方法parse:

LocalDate date = LocalDate.parse("2017-09-21");
LocalTime time = LocalTime.parse("13:45:20");

  一旦传递的字符串参数无法被解析为合法的LocalDate 或LocalTime 对象,这两个parse 方法都会抛出一个继承自RuntimeException 的DateTimeParseException 异常。

使用复合类LocalDateTime

LocalDateTime,是LocalDate 和LocalTime 的合体。它同时表示了日期和时间,但不带有时区信息,可以直接创建,也可以通过合并日期和时间对象创建

LocalDateTime dt1 = LocalDateTime.of(2014, Month.SEPTEMBER, 21, 13, 45, 20);
LocalDateTime dt2 = LocalDateTime.of(date, time);
LocalDateTime dt3 = date.atTime(13, 45, 20);
LocalDateTime dt4 = date.atTime(time);
LocalDateTime dt5 = time.atDate(date);

LocalDate date1 = dt1.toLocalDate();
LocalTime time1 = dt1.toLocalTime();

操纵、解析和格式化日期

withAttribute 方法会创建对象的一个副本,并按照需要修改它的属性,它们都不会修改原来的对象!

LocalDate date1 = LocalDate.of(2017, 9, 21);
LocalDate date2 = date1.withYear(2011);
LocalDate date3 = date2.withDayOfMonth(25);
LocalDate date4 = date3.with(ChronoField.MONTH_OF_YEAR, 2);

  

。。。。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

上一篇:合集-闭包、java8、重写equals、


下一篇:java8-四大函数式接口