前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >技术经验|Java基础之LocalTime类

技术经验|Java基础之LocalTime类

作者头像
艾特
发布2023-12-29 09:40:39
960
发布2023-12-29 09:40:39
文章目录
  • 1 背景
  • 2 Time包在实际开发中的位置
  • 3 本地日期和时间类
    • 3.1 LocalTime自带功能
    • 3.2 LocalTime继承、重写功能
  • 4 总结

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师 🔥 三连支持:如果此文还不错的话,还请 ❤️关注、👍点赞、👉收藏三连,支持一下博主~


1 背景

Java里的日期和时间格式化问题,在JDK8(Java SE Development Kit8,以下使用过程中,均称为JDK1.8或者JDK8)以前有很多问题,例如日期类并不提供国际化,没有时区支持,包分配的也比较混乱。所以在JDK8后进行了大改造,索性在rt.jar中新增了一个time包,这样我们就可以个性化设置日期时间的展示方式了。

目前JDK已经到达了JDK 21(Java Development Kit 21),但是在主流的市场上面,使用JDK8的居多。我们现在已经掌握了不少关于日期和时间的操作技巧,但其实随着时间的不断推移,现实的需求也在不断更新,原先的一些API已经难以满足开发需求了。所以从JDK 8之后,为了满足更多的开发需求,Java给我们增加了不少关于日期时间的新特性,接下来本篇文章就带各位来看看这些新特性有哪些。

其他的就不在介绍那么多了,相关的介绍可以参考上一篇文章:Java基础学习|学JDK8中的时间类LocalDate。其实三个日期、时间类都是在一起:LocalDate、LocalTime、LocalDateTime,主要是需要先了解前两个,但是我们在实际使用过程中,LocalDate和LocalDateTime却是使用频率最高,也是最长使用的两个类。

2 Time包在实际开发中的位置

Time API是一组对日期和时间的最重要方面进行建模的包。java. time包中的核心类使用ISO-8601中定义的日历系统(基于公历系统)作为默认日历。当我们引入JDK8后,可以在rt.jar中的java.time目录下找到对应的基础API,打开可以看到有很多新引入的包和类。功能虽多,但是常用的也就是那么几个,所以你想要尽快熟悉,可以自行点击进去查阅。

在这里插入图片描述
在这里插入图片描述

3 本地日期和时间类

3.1 LocalTime自带功能

API说明,LocalTime自己的方法或功能没有多少,多数都是实现了Temporal, TemporalAdjuster, ChronoLocalDate这三个类。

测试代码如下:

代码语言:javascript
复制
public static void main(String[] args) {

        System.out.println("-- LocalTime自带API功能");
        // 当前时间(包括毫秒),不可修改的静态信息
        System.out.println("LocalTime.now() = " + LocalTime.now());
        // 衍生出来两个方法,其中一个是从时区获取当前时间,另外一个是从从时钟方式获取,这个同LocalDate有相同功能
        System.out.println("LocalTime.now(ZoneId.of('Asia/Shanghai')) = " + LocalTime.now(ZoneId.of("Asia/Shanghai")));

        // 获取一个设定日期,如果小时设置不在有效范围内,则会被提示:Invalid value for HourOfDay (valid values 0 - 23): 2023,其他参数一样。当然如果只是设置到分钟也是可以支撑,最多可以设置到毫秒
        System.out.println("LocalTime.of(19, 11, 12) = " + LocalTime.of(19, 11, 12));
        // ofXXX,获取,创建一个表示几点几分的时间对象,例如我想获取时间为早上八点半(8:30),范围[0, 24 * 60 * 60 - 1]。
        System.out.println("LocalTime.ofSecondOfDay(8 * 60 * 60 + 30 * 60)) = " + LocalTime.ofSecondOfDay(8 * 60 * 60 + 30 * 60));
}

此处需要注意:

(1)ofSecondOfDay方法不考虑时区信息,因此它返回的时间表示是相对于协调世界时(UTC)的。如果你需要考虑特定时区的时间,请使用 ZonedDateTime 类或 OffsetDateTime 类来代替。

打印结果如下:

在这里插入图片描述
在这里插入图片描述

3.2 LocalTime继承、重写功能

这一块的内容同LocalDate差不多,有几处需要注意的,例如LocalTime中没有继承lengXXX这种类型的函数,也没有周期性的类参数设置,而是改为了期间类的函数。

代码语言:javascript
复制
    public static void main(String[] args) {

		System.out.println("-- LocalTime继承重写API功能");
        // getXXX函数,获取当前时间的 时、分、秒、毫秒
        System.out.println("LocalTime.now().getHour() = " + LocalTime.now().getHour());
        System.out.println("LocalTime.now().getMinute() = " + LocalTime.now().getMinute());
        System.out.println("LocalTime.now().getSecond() = " + LocalTime.now().getSecond());
        System.out.println("LocalTime.now().getNano() = " + LocalTime.now().getNano());

        // withXXX函数,with函数就是修改,具体修改的位置在前,参数放在最后。如下:
        System.out.println("LocalTime.now().with(ChronoField.HOUR_OF_DAY, 1) = " + LocalTime.now().with(ChronoField.HOUR_OF_DAY, 1));
        System.out.println("LocalTime.now().with(ChronoField.MINUTE_OF_DAY, 1) = " + LocalTime.now().with(ChronoField.MINUTE_OF_DAY, 1));
        System.out.println("LocalTime.now().with(ChronoField.SECOND_OF_DAY, 1) = " + LocalTime.now().with(ChronoField.SECOND_OF_DAY, 1));

        System.out.println("LocalTime.now().with(ChronoField.MINUTE_OF_HOUR, 1) = " + LocalTime.now().with(ChronoField.MINUTE_OF_HOUR, 1));
        System.out.println("LocalTime.now().with(ChronoField.SECOND_OF_MINUTE, 1) = " + LocalTime.now().with(ChronoField.SECOND_OF_MINUTE, 1));

        System.out.println("LocalTime.now().with(ChronoField.HOUR_OF_AMPM, 1) = " + LocalTime.now().with(ChronoField.HOUR_OF_AMPM, 1));
        System.out.println("LocalTime.now().with(ChronoField.SECOND_OF_MINUTE, 1) = " + LocalTime.now().with(ChronoField.SECOND_OF_MINUTE, 1));

        // 也可以直接修改,等同于LocalTime.now().with(ChronoField.HOUR_OF_DAY, 2),如:
        System.out.println("LocalTime.now().withHour(2) = " + LocalTime.now().withHour(2));

        // 对比日期,时间也有加减,主要有两种类型。
        // 方式一 增加量那个小时、分、秒、毫秒等
        System.out.println("LocalTime.now().plusHours(2) = " + LocalTime.now().plusHours(2));
        // 方式二 增加10分钟,此处需要注意,在LocalDate中,我们使用Period这个类,而在此处需要使用Duration,至于是什么原因,我个人感觉应该使用频率的问题。大家可以各抒己见。
        System.out.println("LocalTime.now().plusDays(3) = " + LocalTime.now().plus(10, ChronoUnit.MINUTES));
        System.out.println("LocalTime.now().plus(Period.ofDays(1)) = " + LocalTime.now().plus(Duration.ofMinutes(20)));

        // isXXX函数
        // 当前日期是否在指定日期之前/之后
        System.out.println("LocalTime.now().isBefore(LocalTime.now().minusHours(1)) = " + LocalTime.now().isBefore(LocalTime.now().minusHours(1)));
        System.out.println("LocalTime.now().isAfter(LocalTime.now().minusHours(1)) = " + LocalTime.now().isAfter(LocalTime.now().minusHours(1)));
    }

打印结果如下:

在这里插入图片描述
在这里插入图片描述

4 总结

在JDK8之前我们都是使用Date或者Calendar来做计算或者转换,自从有了JDK8,我们的CVX速度很明显增强了。JDK8引入了许多新的特性和改进,使得代码编写更加简洁、可读性更高,并且提供了更好的性能和并发处理能力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1 背景
  • 2 Time包在实际开发中的位置
  • 3 本地日期和时间类
    • 3.1 LocalTime自带功能
      • 3.2 LocalTime继承、重写功能
      • 4 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档