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);
。。。。