前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Date API用着不顺手?来看看Java8是怎么优化的

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

作者头像
南风
发布2019-08-08 17:04:54
7880
发布2019-08-08 17:04:54
举报
文章被收录于专栏:Java大联盟
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 类只包括日期,常用方法如下所示。

具体操作如下所示。

代码语言:javascript
复制
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 类只包括时间,常用方法如下所示。

具体操作如下所示。

代码语言:javascript
复制
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 多了一个时区,具体操作如下所示。

代码语言:javascript
复制
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类详解

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java大联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档