Date API用着不顺手?来看看Java8是怎么优化的

Java大联盟

致力于最高效的Java学习

关注

Java8 之前,对于日期和时间的操作主要是通过 Date 来完成的,但是 Date 类的设计存在诸多不足。

例如 java.util 和 java.sql 中都定义了同名的 Date 类,但是使用起来却并不匹配,java.util.Date 包含日期和时间,但是 java.sql.Date 没有时间,只包含日期。

另外 java.util.Date 的月是从 0 开始计算的,比如 7 月对应的值就是 6,但是日期又是从 1 开始计算的,使用起来很不方便,同时对日期进行格式化操作的 SimpleDateFormat 类又定义在 java.text 包中。

日期类不支持时区,所以 Java 引入了 java.util.Calendar 来管理相关功能,但是使用起来仍存在问题。

日期类除了操作不便、不支持时区,最大的问题在于所有的日期类都是非线程安全的,可以随意更改。

综上所述,开发者急需一个全新的 API 来替代旧版的日期类,Java8 解决了这一问题,全新的 java.time API 解决了旧版 API 中的许多问题,今天我们就来详细学习 Java8 日期 API 的使用。

首先是解决时区问题的 Local,具体有两个类 LocalDate 和 LocalDateTime。

LocalDate 类只包括日期,常用方法如下所示。

具体操作如下所示。

public class LocalDateTest {
    public static void main(String[] args) {
        LocalDate localDate = LocalDate.now();
        System.out.println("now方法:"+localDate);
        localDate = LocalDate.of(2019,1,1);
        System.out.println("of方法:"+localDate);
        localDate = LocalDate.ofYearDay(2019,33);
        System.out.println("ofYearDay方法:"+localDate);
        localDate = LocalDate.parse("2019-06-22");
        System.out.println("parse方法:"+localDate);
        System.out.println("getYear方法:"+localDate.getYear());
        System.out.println("getMonthValue方法:"+localDate.getMonthValue());
        System.out.println("getDayOfMonth方法:"+localDate.getDayOfMonth());
        System.out.println("getDayOfYear方法:"+localDate.getDayOfYear());
        System.out.println("getDayOfWeek方法:"+localDate.getDayOfWeek());
        System.out.println("isLeapYear方法:"+localDate.isLeapYear());
        System.out.println("lengthOfMonth方法:"+localDate.lengthOfMonth());
        System.out.println("lengthOfYear方法:"+localDate.lengthOfYear());
        System.out.println("withYear方法:"+localDate.withYear(2016));
        System.out.println("withMonth方法:"+localDate.withMonth(1));
        System.out.println("withDayOfMonth方法:"+localDate.withDayOfMonth(11));
        System.out.println("withDayOfYear方法:"+localDate.withDayOfYear(360));
        System.out.println("plusYears方法:"+localDate.plusYears(3));
        System.out.println("plusMonths方法:"+localDate.plusMonths(3));
        System.out.println("plusWeeks方法:"+localDate.plusWeeks(2));
        System.out.println("plusDays方法:"+localDate.plusDays(20));
        System.out.println("minusYears方法:"+localDate.minusYears(3));
        System.out.println("minusMonths方法:"+localDate.minusMonths(3));
        System.out.println("minusWeeks方法:"+localDate.minusWeeks(2));
        System.out.println("minusDays方法:"+localDate.minusDays(20));
        LocalDate localDate1 = LocalDate.of(2018,1,1);
        System.out.println("isAfter方法:"+localDate.isAfter(localDate1));
        System.out.println("isBefore方法:"+localDate.isBefore(localDate1));
    }
}

运行结果如下图所示。

LocalDateTime 类只包括时间,常用方法如下所示。

具体操作如下所示。

public class LocalDateTimeTest {
    public static void main(String[] args) {
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println("localDateTime方法:"+localDateTime);
        localDateTime = LocalDateTime.of(2019,6,22,10,10,10);
        System.out.println("of方法:"+localDateTime);
        localDateTime = LocalDateTime.parse("2019-06-22T10:10:10");
        System.out.println("parse方法:"+localDateTime);
        LocalDate localDate = localDateTime.toLocalDate();
        System.out.println("localDate方法:"+localDate);
        System.out.println("getYear方法:"+localDateTime.getYear());
        System.out.println("getMonthValue方法:"+localDateTime.getMonthValue());
        System.out.println("getDayOfMonth方法:"+localDateTime.getDayOfMonth());
        System.out.println("getDayOfYear方法:"+localDateTime.getDayOfYear());
        System.out.println("getDayOfWeek方法:"+localDateTime.getDayOfWeek());
        System.out.println("getHour方法:"+localDateTime.getHour());
        System.out.println("getMinute方法:"+localDateTime.getMinute());
        System.out.println("getSecond方法:"+localDateTime.getSecond());
        System.out.println("getNano方法:"+localDateTime.getNano());
        System.out.println("withYear方法:"+localDateTime.withYear(2016));
        System.out.println("withMonth方法:"+localDateTime.withMonth(1));
        System.out.println("withDayOfMonth方法:"+localDateTime.withDayOfMonth(11));
        System.out.println("withDayOfYear方法:"+localDateTime.withDayOfYear(360));
        System.out.println("withHour方法:"+localDateTime.withHour(22));
        System.out.println("withMinute方法:"+localDateTime.withMinute(15));
        System.out.println("withSecond方法:"+localDateTime.withSecond(23));
        System.out.println("withNano方法:"+localDateTime.withNano(360));
        System.out.println("plusYears方法:"+localDateTime.plusYears(3));
        System.out.println("plusMonths方法:"+localDateTime.plusMonths(3));
        System.out.println("plusWeeks方法:"+localDateTime.plusWeeks(2));
        System.out.println("plusDays方法:"+localDateTime.plusDays(20));
        System.out.println("plusHours方法:"+localDateTime.plusHours(22));
        System.out.println("plusMinutes方法:"+localDateTime.plusMinutes(15));
        System.out.println("plusSeconds方法:"+localDateTime.plusSeconds(23));
        System.out.println("plusNanos方法:"+localDateTime.plusNanos(360));
        System.out.println("minusYears方法:"+localDateTime.minusYears(3));
        System.out.println("minusMonths方法:"+localDateTime.minusMonths(3));
        System.out.println("minusWeeks方法:"+localDateTime.minusWeeks(2));
        System.out.println("minusDays方法:"+localDateTime.minusDays(20));
        System.out.println("minusHours方法:"+localDateTime.minusHours(22));
        System.out.println("minusMinutes方法:"+localDateTime.minusMinutes(15));
        System.out.println("minusSeconds方法:"+localDateTime.minusSeconds(23));
        System.out.println("minusNanos方法:"+localDateTime.minusNanos(360));
        LocalDateTime localDateTime1 = LocalDateTime.of(2018,1,1,10,10,10);
        System.out.println("isAfter方法:"+localDateTime.isAfter(localDateTime1));
        System.out.println("isBefore方法:"+localDateTime.isBefore(localDateTime1));
    }
}

运行结果如下图所示。

LocalDate 和 LocalDateTime 都不带时区,如果要添加时区进行操作,可以使用 ZonedDateTime。

ZonedDateTime 类以某个时区来创建日期时间对象,不能修改,时间精度为纳秒,ZonedDateTime 中的常用方法与 LocalDateTime 一致,区别在于 LocalDateTime 不需要时区,ZonedDateTime 多了一个时区,具体操作如下所示。

public class ZonedDateTimeTest {
    public static void main(String[] args) {
        ZoneId currentZone = ZoneId.systemDefault();
        System.out.println("当前时区: " + currentZone);
        ZonedDateTime zonedDateTime = ZonedDateTime.now();
        System.out.println("当前时间:"+zonedDateTime);
        zonedDateTime = ZonedDateTime.now(ZoneId.of("Europe/Rome"));
        System.out.println("罗马时间:"+zonedDateTime);
        System.out.println("getYear方法:"+zonedDateTime.getYear());
        System.out.println("getMonthValue方法:"+zonedDateTime.getMonthValue());
        System.out.println("getDayOfMonth方法:"+zonedDateTime.getDayOfMonth());
        System.out.println("getDayOfYear方法:"+zonedDateTime.getDayOfYear());
        System.out.println("getDayOfWeek方法:"+zonedDateTime.getDayOfWeek());
        System.out.println("getHour方法:"+zonedDateTime.getHour());
        System.out.println("getMinute方法:"+zonedDateTime.getMinute());
        System.out.println("getSecond方法:"+zonedDateTime.getSecond());
        System.out.println("getNano方法:"+zonedDateTime.getNano());
        System.out.println("withYear方法:"+zonedDateTime.withYear(2016));
        System.out.println("withMonth方法:"+zonedDateTime.withMonth(1));
        System.out.println("withDayOfMonth方法:"+zonedDateTime.withDayOfMonth(11));
        System.out.println("withDayOfYear方法:"+zonedDateTime.withDayOfYear(360));
        System.out.println("withHour方法:"+zonedDateTime.withHour(22));
        System.out.println("withMinute方法:"+zonedDateTime.withMinute(15));
        System.out.println("withSecond方法:"+zonedDateTime.withSecond(23));
        System.out.println("withNano方法:"+zonedDateTime.withNano(360));
        System.out.println("plusYears方法:"+zonedDateTime.plusYears(3));
        System.out.println("plusMonths方法:"+zonedDateTime.plusMonths(3));
        System.out.println("plusWeeks方法:"+zonedDateTime.plusWeeks(2));
        System.out.println("plusDays方法:"+zonedDateTime.plusDays(20));
        System.out.println("plusHours方法:"+zonedDateTime.plusHours(22));
        System.out.println("plusMinutes方法:"+zonedDateTime.plusMinutes(15));
        System.out.println("plusSeconds方法:"+zonedDateTime.plusSeconds(23));
        System.out.println("plusNanos方法:"+zonedDateTime.plusNanos(360));
        System.out.println("minusYears方法:"+zonedDateTime.minusYears(3));
        System.out.println("minusMonths方法:"+zonedDateTime.minusMonths(3));
        System.out.println("minusWeeks方法:"+zonedDateTime.minusWeeks(2));
        System.out.println("minusDays方法:"+zonedDateTime.minusDays(20));
        System.out.println("minusHours方法:"+zonedDateTime.minusHours(22));
        System.out.println("minusMinutes方法:"+zonedDateTime.minusMinutes(15));
        System.out.println("minusSeconds方法:"+zonedDateTime.minusSeconds(23));
        System.out.println("minusNanos方法:"+zonedDateTime.minusNanos(360));
    }
}

运行结果如下图所示。

往期文章一览

1、Java8新特性:Lambda表达式详解

2、Java8新特性:方法引用详解

3、Java8新特性:默认方法详解

4、Java8新特性:Optional类详解

原文发布于微信公众号 - Java大联盟(javaunion)

原文发表时间:2019-08-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券