写点什么

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

  • 2022 年 7 月 27 日
  • 本文字数:2105 字

    阅读完需:约 7 分钟


前言📫 作者简介:小明 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)并进行实战演示

发布于: 刚刚阅读数: 4
用户头像

物有本末,事有终始。知所先后,则近道矣 2020.03.20 加入

🏆CSDNJava领域优质创作者/阿里云专家博主/华为云专家 📫就职某大型金融互联网公司后端高级工程师 👍专注于研究计算机底层/Java/架构/设计模式/算法

评论

发布
暂无评论
【函数式编程实战】(十) 优雅的处理代码中的时间类_Lambda_小明Java问道之路_InfoQ写作社区