【精通函数式编程】(十) 优雅的处理代码中的时间类

简介: 本讲讲解Java以前的Date类、Calender类的缺陷,说明为什么要使用新型的时间类(LocalDate、LocalTime、LocalDateTime、Duration、Period、TemporalAdjuster)并进行实战演示

 

前言📫 作者简介:小明java问道之路,专注于研究计算机底层,就职于金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的设计和架构📫

🏆 Java领域优质创作者、阿里云专家博主、华为云专家🏆

🔥 如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主哦

本文导读

java8之前的的Date类、Calender类等在逐渐淘汰或者已经死亡,新的时间与日期类LocalDate、LocalTime、LocalDateTime……正在悄悄流行

一、新的时间API(LocalDate、LocalTime、LocalDateTime)

Java在逐渐淘汰Date类、Calender类因为首先可变的*(不安全),DateFormat有线程安全问题

LocalDate是一个不可变对象,它只提供简单的日志,并且不含当天的时间,也不附带任何与时区的信息,可以通过静态工厂方法 of 创建。

public static void main(String[] args) {
        // LocalDate 常用api
        LocalDate date = LocalDate.of(2022, 2, 24);
        LocalDate.now();
        date.getYear();
        date.getMonth();
        date.getDayOfMonth();
        date.lengthOfMonth();
        date.isLeapYear();
        // LocalTime 常用api
        LocalTime time = LocalTime.of(14, 2, 24);
        LocalTime.now();
        LocalTime.parse("14:14:14");
        time.getHour();
        time.getMinute();
        time.getSecond();
        // LocalDateTime 常用api ,合并日期和时间
        LocalDateTime dateTime = LocalDateTime.of(2022, 2, 24, 14, 2, 24);
        LocalDateTime dateTime1 = LocalDateTime.of(date, time);
        dateTime.toLocalDate();
        dateTime.toLocalTime();
    }

二、新的时间API(Duration、Period)

LocalDate、LocalTime、LocalDateTime都是继承自Temporal接口,Temporal接口定义了如何读取和操作时间的对象。Duration、Period 可以对这些对象进行操作,例如比较、检查等等

public static void main(String[] args) {
    // Duration 创建两个时间之间的 时间间隔
    Duration duration = Duration.between(LocalTime.of(14, 2, 24)
            , LocalTime.of(15, 2, 24));
    System.out.println(duration);
    // Period 创建两个时间之间的 日期间隔
    Period period = Period.between(LocalDate.of(2022, 2, 24)
            , LocalDate.of(2022, 2, 24));
    System.out.println(period);
}

三、解析与格式化日期API(TemporalAdjuster)

LocalDate对象提供了大量帮助你操作的API,但是可以看到, LocalDate、LocalDateTime等等时间工具类局限性还是比较大,操作过于直接,Java提供了 TemporalAdjuster 对象 ,这里面是一些通用的方法,在实际操作过程中可以使用通用方法避免硬编码,提高可读性

dayOfWeekInMonth

创建一个值为同一个月中每一周的第几天(负数表示从月末往月初计数)

firstDayOf*

firstDayOfNonth创建当月的第一天;firstDayOfNextMonth 创建下月的第一天;firstDayOfNextYear 创建明年的第一天;firstDayOfYear 创建当年的第一天firstInMonth 创建一个新的日期,它的值为同一个月中,第一个符合星期几要求的值

lastDayOf*

lastDayOfMonth 创建当月的最后一天;lastDayOfNextMonth 创建下月的最后一天;lastDayOfNextYear 创建明年的最后一天;lastDayOfYear 创建当年的最后一天;lastInMonth 创建同一个月中,最后一个符合星期几要求的值

next* / previous*

next/previous 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期;nextOrSame/previousOrSame 创建一个新的日期,并将其值设定为日期调整后或者调整前,第一个符合指定星期几要求的日期,如果该日期已经符合要求,则直接返回该对象

public void localDateImpl() {
    LocalDate date = LocalDate.of(2022, 2, 24);
    // 修改时间, 需要用另一个对象接收
    // 创建一个日期是设定日期的,第一个符合设置星期的时间
    date.with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY));
    // 创建一个日期是当月的最后一天
    date.with(TemporalAdjusters.lastDayOfMonth());
}

四、处理时区的API(ZoneId)

到此看到的日期和时间的种类都不包含时区信息。新版java. time . ZoneId类是老版java.util. TimeZone类的替代品。跟Java8 新增的其他日期和时间API类一样,ZoneId 类也是无法修改的。

网络异常,图片无法展示
|

时区是按照区域划分的,我们在使用ZoneId时,要明确地区ID,可以通过 toZoneId()方法获取ZoneId对象,ZoneId对象可以和LocalDate对象连用

public void zoneId() {
        ZoneId zoneId = TimeZone.getDefault().toZoneId();
        // Asia/Shanghai
        System.out.println(zoneId);
        LocalDate date = LocalDate.now();
        // 2022-02-24T00:00+08:00[Asia/Shanghai]
        System.out.println(date.atStartOfDay(zoneId));
    }

总结

本讲讲解Java以前的Date类、Calender类的缺陷,说明为什么要使用新型的时间类(LocalDate、LocalTime、LocalDateTime、Duration、Period、TemporalAdjuster)并进行实战演示

相关文章
|
并行计算 Java 编译器
教你精通Java语法之第十五章、Lambda表达式
Lambda表达式的优点很明显,在代码层次上来说,使代码变得非常的简洁。缺点也很明显,代码不易读。1. 代码简洁,开发迅速2. 方便函数式编程3. 非常容易进行并行计算4. Java 引入 Lambda,改善了集合操作1. 代码可读性变差2. 在非并行计算中,很多计算未必有传统的 for 性能要高3. 不容易进行调试。
73 0
|
自然语言处理 Java 编译器
都2023年了,如果不会Lambda表达式、函数式编程?你确定能看懂公司代码?
都2023年了,如果你不会Lambda表达式、函数式编程?你确定能看懂公司代码? 那么建议来了解一下Lambda表达式, 因为它使用简单,易操作,易上手而代码简洁,开发快速,一看就令人很爽😎😎😎 . 其实Lambda表达式接近自然语言,易于理解 , 集万千优点与一身, 比匿名内部类更加完美👉👉👉.下面来简单认识一下今天的主角Lambda表达式吧
136 0
|
7月前
|
Java 开发者
深入理解Java中的Lambda表达式与函数式编程
在Java 8中引入的Lambda表达式,为Java带来了一种全新的编程范式——函数式编程。本文将深入探讨Lambda表达式的概念、语法和实际应用场景,以及它如何改变我们编写和维护代码的方式。通过具体的例子,我们将看到Lambda表达式如何简化代码结构,提高开发效率,并使代码更加简洁易读。最后,我们将讨论Lambda表达式在多线程编程中的应用,以及它对Java开发者技能集的影响。
|
Java 开发者
泛型,不只是简单类 | 带你学《Java面向对象编程》之六十六
泛型不光可以用在类的定义上,它同样也能用于接口和方法的定义,本节将为读者展示这两类使用方式。
泛型,不只是简单类   | 带你学《Java面向对象编程》之六十六
|
9月前
|
Java 编译器
滚雪球学Java(36):玩转Java方法重载和可变参数,让你的代码更灵活
【5月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
53 0
|
Java
java8 Lambda表达式的新手上车指南(1)--基础语法和函数式接口
背景   java9的一再推迟发布,似乎让我们恍然想起离发布java8已经过去了三年之久,java8应该算的上java语言在历代版本中变化最大的一个版本了,最大的新特性应该算得上是增加了lambda表达式,借助lambda表达式,我们可以编写出性能更好,可读性更强的代码,更重要的,它给我们带来了一种...
1603 0
|
9月前
|
安全 Java 程序员
深入探索Java泛型编程
深入探索Java泛型编程
37 0
|
9月前
|
存储 算法 Java
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
【4月更文挑战第9天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
80 1
滚雪球学Java(20):Java泛型与枚举:提升代码灵活性与可读性
|
9月前
|
存储 Java
滚雪球学Java(41):Lambda表达式和方法引用:提高代码可读性和简洁性的神器
【5月更文挑战第16天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
73 2
滚雪球学Java(41):Lambda表达式和方法引用:提高代码可读性和简洁性的神器

热门文章

最新文章