您当前的位置:首页 > 电脑百科 > 程序开发 > 语言 > JAVA

Java8的LocalDateTime还没搞懂?一文轻松解决掉你的烦恼

时间:2023-04-06 12:27:02  来源:微信公众号  作者:Java技术指北

哈喽,大家好,我是了不起。

LocalDateTime 是JAVA8中新加入的日期时间类,现在都 Java20 了,不会还有人没用过 LocalDateTime 吧?

今天给大家演示一下 LocalDateTime 的常用方法。

前言

LocalDateTime、LocalDate、LocalTime 是 Java8 全新的日期框架,加强了对时间的管理,有很多特别好用的时间运算方法,而且是线程安全的,较之前的 util.Date 以及 Calander 使用起来更加的方便直观,下面介绍几种常见的日期对象用法。

  • LocalDateTime:日期加时间的日期对象,包含年月日时分秒
  • LocalDate:日期类,包含年月日
  • LocalTime:时间类,包含时分秒

LocalDateTime

获取当前时间

 
@Test
public void test() {
    LocalDate localDate = LocalDate.now();
    LocalTime localTime = LocalTime.now();
    LocalDateTime localDateTime = LocalDateTime.now();
    System.out.println("localDate:"+localDate);//2023-02-22
    System.out.println("localTime:"+localTime);//17:25:36.590
    System.out.println("localDateTime:"+localDateTime);//2023-02-22T17:25:36.590
}

输出结果:

图片

可以看到不用做格式转换就可以得到可读性很高的日期格式。注意:ISO 8601规定的日期和时间分隔符是T。标准格式如下:

  • 日期:yyyy-MM-dd
  • 时间:HH:mm:ss
  • 带毫秒的时间:HH:mm:ss.SSS
  • 日期和时间:yyyy-MM-dd'T'HH:mm:ss
  • 带毫秒的日期和时间:yyyy-MM-dd'T'HH:mm:ss.SSS

获取当前时间的年月日时分秒

@Test
public void test() {
    LocalDateTime localDateTime = LocalDateTime.now(); // 获取当前时间
    int year = localDateTime.getYear(); // 获取年份 2023
    int month = localDateTime.getMonthValue(); // 获取月份 2
    int day = localDateTime.getDayOfMonth(); // 获取月中的天数 22
    int hour = localDateTime.getHour(); // 获取当前的小时 17
    int minute = localDateTime.getMinute(); // 获取当前分钟 33
    int second = localDateTime.getSecond(); // 获取当前秒数 22
    System.out.println(year);
    System.out.println(month);
    System.out.println(day);
    System.out.println(hour);
    System.out.println(minute);
    System.out.println(second);
}

输出结果:

图片

给LocalDateTime赋值

在static目录中新建kaptcha.html页面,代码如下:

 
public void test() {
    LocalDateTime of = LocalDateTime.of(2023,2,22,22,22,22);
    System.out.println(of); // 输出2023-02-22T22:22:22
}

时间与字符串相互转换

@Test
public void test() {
    // 将字符串转换为指定格式的时间(格式要和给定的格式一致,不然会报错)
    LocalDateTime parse = LocalDateTime.parse("2023-02-22 22:22:22", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    LocalDateTime parse1 = LocalDateTime.parse("2023 02 22 22:22:22", DateTimeFormatter.ofPattern("yyyy MM dd HH:mm:ss"));
    LocalDateTime parse2 = LocalDateTime.parse("2023.02.22 22:22:22", DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"));
    System.out.println(parse); // 输出2023-02-22T22:22:22
    System.out.println(parse1); // 输出2023-02-22T22:22:22
    System.out.println(parse2); // 输出2023-02-22T22:22:22
    // 时间转字符串
    LocalDateTime now = LocalDateTime.now();
    DateTimeFormatter of = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    String dateTime = now.format(of);
    System.out.println(dateTime); // 输出 2023-02-22 17:56:18
}

输出结果:

图片

时间运算:加上对应时间

LocalDateTime提供了对日期和时间进行加减的非常简单的链式调用,让时间运算变得非常简单:

 
@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间2023-02-22T18:00:19.352
    LocalDateTime plusYears= now.plusYears(2); // 在当前时间加上2年2025-02-22T18:00:19.352
    LocalDateTime plusMnotallow= now.plusMonths(2);// 在当前时间商加上2月2023-04-22T18:00:19.352
    LocalDateTime plusDays= now.plusDays(2); // 在当前时间加上2天2023-02-24T18:00:19.352
    LocalDateTime plusHours= now.plusHours(2); // 在当前时间加上2个小时2023-02-22T20:00:19.352
    LocalDateTime plusMinutes= now.plusMinutes(30); // 在当前时间加上30分钟2023-02-22T18:30:19.352
    LocalDateTime plusSeconds = now.plusSeconds(30); // 在当前时间加上30秒2023-02-22T18:00:49.352
    System.out.println(now);
    System.out.println(plusYears);
    System.out.println(plusMonths);
    System.out.println(plusDays);
    System.out.println(plusHours);
    System.out.println(plusMinutes);
    System.out.println(plusSeconds);
}

输出结果:

图片

时间运算:减去对应时间

 
@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    LocalDateTime minusYears = now.minusYears(2); // 在当前时间减上2年
    LocalDateTime minusMonths = now.minusMonths(2);// 在当前时间商减上2月
    LocalDateTime minusDays = now.minusDays(2); // 在当前时间减上2天
    LocalDateTime minusHours = now.minusHours(2); // 在当前时间减上2个小时
    LocalDateTime minusMinutes = now.minusMinutes(30); // 在当前时间减上30分钟
    LocalDateTime minusSeconds = now.minusSeconds(30); // 在当前时间减上30秒
    System.out.println("now:" + now);
    System.out.println("minusYears:" + minusYears);
    System.out.println("minusMonths:" + minusMonths);
    System.out.println("minusDays:" + minusDays);
    System.out.println("minusHours:" + minusHours);
    System.out.println("minusMinutes:" + minusMinutes);
    System.out.println("minusSeconds:" + minusSeconds);
}

输出结果:

图片

两个时间比较

@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    LocalDateTime now1 = now.plusYears(5); // 在当前时间加上5年
    //  给LocalDateTime 赋值
    LocalDateTime of = LocalDateTime.of(2023,2,2,22,22,22);
    LocalDateTime of1 = LocalDateTime.of(2023,8,5,1,1,1);
    //两个时间作比较,第一个时间减去第二个时间(如果年份相同,比较月份,月份相同比较天数,以此类推)
    int compareTo = now1.compareTo(now);
    int compareTo1 = now.compareTo(now1);
    int compareTo2 = now.compareTo(of);
    int compareTo3 = now.compareTo(of1);
    System.out.println(now);   // 输出 2023-02-22T20:19:44.112v
    System.out.println(now1); // 输出 2028-02-22T20:19:44.112
    System.out.println(of); // 输出 2023-02-02T22:22:22
    System.out.println(of1); // 输出 2023-08-05T01:01:01
    System.out.println(compareTo); // 输出 5
    System.out.println(compareTo1); // 输出 -5
    System.out.println(compareTo2); // 输出 20
    System.out.println(compareTo3); // 输出 -6
}

输出结果:

图片

利用Duration计算时间差

注意没有计算相差的年和秒值,对于要计算相差的秒数,可以利用计算毫秒来进行转换

 
@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    //  给LocalDateTime 赋值
    LocalDateTime of = LocalDateTime.of(2022,2,22,2,2,2);
    Duration duration = Duration.between(of,now); // 后面减去前面
    long toDays = Duration.between(of,now).toDays(); //相差的天数
    long toHours = Duration.between(of,now).toHours();//相差的小时数
    long toMinutes = Duration.between(of,now).toMinutes();//相差的分钟数
    long toMillis = Duration.between(of,now).toMillis();//相差毫秒数
    long toNanos = Duration.between(of,now).toNanos();//相差的纳秒数
    System.out.println("toDays:"+ toDays); // 输出 toDays:365
    System.out.println("toHours:"+ toHours); // 输出 toHours:8778
    System.out.println("toMinutes:"+ toMinutes); // 输出 toMinutes:526732
    System.out.println("toMillis:"+ toMillis); // 输出 toMillis:31603973840
    System.out.println("toNanos:"+ toNanos); // 输出 toNanos:31603973840000000
}

输出结果:

图片

改变当前时间的年月日时分秒

@Test
public void test() {
    LocalDateTime now = LocalDateTime.now(); // 当前时间
    LocalDateTime withYear = now.withYear(2060); // 改变当前年份(变成2060年)
    LocalDateTime withMonth = now.withMonth(12); // 改变当前月份(变成12月份)
    LocalDateTime withDayOfMonth = now.withDayOfMonth(28); //改变当前天数(变成28日)
    LocalDateTime withHour = now.withHour(23); // 改变当前小时数(变成23时)
    LocalDateTime withMinute = now.withMinute(30); // 改变当前分钟(变成30分钟)
    LocalDateTime withSecond = now.withSecond(23); // 改变当前小时数(变成23时)
    LocalDateTime withDayOfYear = now.withDayOfYear(60); // 从一月一号开始加上60天
    System.out.println(now);
    System.out.println("withYear:"+ withYear);
    System.out.println("withMonth:"+ withMonth);
    System.out.println("withDayOfMonth:"+ withDayOfMonth);
    System.out.println("withHour:"+ withHour);
    System.out.println("withMinute:"+ withMinute);
    System.out.println("withSecond:"+ withSecond);
    System.out.println("withDayOfYear:"+ withDayOfYear);
}

输出结果:

图片

自定义输出的格式

 
@Test
public void test() {
    // 自定义格式化:
    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
    DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss");
    System.out.println("自定义格式yyyy/MM/dd HH:mm:ss :"+dtf.format(LocalDateTime.now()));
    System.out.println("自定义格式yyyy.MM.dd HH:mm:ss :"+dtf1.format(LocalDateTime.now()));

    // 用自定义格式解析:
    LocalDateTime dt2 = LocalDateTime.parse("2020/10/20 15:16:17", dtf);
    System.out.println("格式解析:"+dt2);
}

输出结果:

图片

LocalDateTime的with()方法

 
@Test
public void test() {
    // 本月第一天0:00时刻:
    LocalDateTime firstDay = LocalDate.now().withDayOfMonth(1).atStartOfDay();
    // 本月最后1天:
    LocalDate lastDay = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
    // 下月第1天:
    LocalDate nextMonthFirstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
    // 本月第1个周一:
    LocalDate firstWeekday = LocalDate.now().with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
}

两个日期前后的比较与判断

 
@Test
public void test() {
    //判断两个时间点的前后
    LocalDateTime now = LocalDateTime.now();
    LocalDateTime target = LocalDateTime.of(2022, 2, 22, 22, 22, 22);
    boolean isBefore = now.isBefore(target);
    System.out.println("now:"+now);
    System.out.println("target:"+target);
    System.out.println("isBefore:"+isBefore);
    System.out.println(LocalDate.now().isBefore(LocalDate.of(2022, 2, 22)));
    System.out.println(LocalTime.now().isAfter(LocalTime.parse("08:15:00")));
}

输出结果:

图片

结束语

LocalDateTime获取时间以及计算都非常方便,而且是线程安全的,建议使用LocalDateTime。



Tags:Java8   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Java8的LocalDateTime还没搞懂?一文轻松解决掉你的烦恼
哈喽,大家好,我是了不起。LocalDateTime 是Java8中新加入的日期时间类,现在都 Java20 了,不会还有人没用过 LocalDateTime 吧?今天给大家演示一下 LocalDateTime 的常用方法。前...【详细内容】
2023-04-06  Search: Java8  点击:(365)  评论:(0)  加入收藏
macOS版Java8开发环境搭建(基于Intel x86 64-bit)
日常办公和软件开发除了可以使用Windows系统以外,还可以使用macOS系统,至于具体使用什么系统取决于你入职公司之后公司给你发的什么电脑,如果是MacBookPro那么就使用macOS开...【详细内容】
2022-12-23  Search: Java8  点击:(314)  评论:(0)  加入收藏
详解Java8中的StringJoiner使用
面试题在之前的内容中我们介绍了字符串。同时,也介绍了字符串的拼接操作,并且分析了几种字符串拼接方式的原理。其实在java8中还提供了一种新的字符串操作方式。就是今天我们...【详细内容】
2022-12-02  Search: Java8  点击:(426)  评论:(0)  加入收藏
详解java5、java6、java7、java8、java9新特性
1. 介绍JAVA作为使用的主力语言,掌握下其历史发展也是有必要的。看看从JAVA5开始到现在的JAVA9有哪些变化。借此机会,也可以看看哪些特性我们是已经用到的,哪些是还没有用到的...【详细内容】
2022-07-30  Search: Java8  点击:(630)  评论:(0)  加入收藏
Java8特性之Optional:如何干掉空指针?
Optional的作用是什么?他都有哪些方法?阿里规范点名说尽量用Optional来避免空指针,那么什么场景用Optional?本篇文章围绕这三点来进行讲解。目录 一、Optional类的来源 二、Opt...【详细内容】
2022-06-27  Search: Java8  点击:(234)  评论:(0)  加入收藏
高效遍历数据,试试 Java8 中的 ParallelStream 并行流?
ParallelStream并行流在之前文章Java8新特性-Stream API中有简单的介绍过它的使用。如Collection集合可以通过parallelStream()的得到一个并行流。Stream<Integer> stream =...【详细内容】
2022-05-09  Search: Java8  点击:(412)  评论:(0)  加入收藏
java8中自带常用的函数式接口
public class LambdaDemo { public static void main(String[] args) { /** * 用来判定true或者false boolean test(T t); */ Predicat...【详细内容】
2021-10-18  Search: Java8  点击:(411)  评论:(0)  加入收藏
使用 IDEA 解决 Java8 的数据流问题,用过的都说好
IDEA在手 天下我有我们打算将Pondus的所有生产服务器升级到这一新版本。 从那时起,我们将大部分代码库迁移到lambda表达式、数据流和新的日期API上。 我们也会使用Nashorn来...【详细内容】
2021-06-10  Search: Java8  点击:(494)  评论:(0)  加入收藏
放弃 StringBuilder!Java8的StringJoiner,真香
为什么会新增这样一个string辅助类?原有的stringbuilder太死板,不支持分割,如果想让最终的字符串以逗号隔开,需要这样写StringBuilder sb = new StringBuilder();IntStream.ran...【详细内容】
2021-05-17  Search: Java8  点击:(413)  评论:(0)  加入收藏
玩转Java8 lambda表达式&函数式接口一
Lambda表达式简介Lambda表达式是java 1.8才开始有的重要功能,使用Lambda表达式可以替代匿名内部类,代码简洁易懂,提升工作效率。上代码:使用内部类和使用lambda实现代码量对比函...【详细内容】
2021-03-15  Search: Java8  点击:(712)  评论:(0)  加入收藏
▌简易百科推荐
Java 8 内存管理原理解析及内存故障排查实践
本文介绍Java8虚拟机的内存区域划分、内存垃圾回收工作原理解析、虚拟机内存分配配置,以及各垃圾收集器优缺点及场景应用、实践内存故障场景排查诊断,方便读者面临内存故障时...【详细内容】
2024-03-20  vivo互联网技术    Tags:Java 8   点击:(14)  评论:(0)  加入收藏
如何编写高性能的Java代码
作者 | 波哥审校 | 重楼在当今软件开发领域,编写高性能的Java代码是至关重要的。Java作为一种流行的编程语言,拥有强大的生态系统和丰富的工具链,但是要写出性能优异的Java代码...【详细内容】
2024-03-20    51CTO  Tags:Java代码   点击:(24)  评论:(0)  加入收藏
在Java应用程序中释放峰值性能:配置文件引导优化(PGO)概述
译者 | 李睿审校 | 重楼在Java开发领域,优化应用程序的性能是开发人员的持续追求。配置文件引导优化(Profile-Guided Optimization,PGO)是一种功能强大的技术,能够显著地提高Ja...【详细内容】
2024-03-18    51CTO  Tags:Java   点击:(25)  评论:(0)  加入收藏
Java生产环境下性能监控与调优详解
堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,...【详细内容】
2024-02-04  大雷家吃饭    Tags:Java   点击:(57)  评论:(0)  加入收藏
在项目中如何避免和解决Java内存泄漏问题
在Java中,内存泄漏通常指的是程序中存在一些不再使用的对象或数据结构仍然保持对内存的引用,从而导致这些对象无法被垃圾回收器回收,最终导致内存占用不断增加,进而影响程序的性...【详细内容】
2024-02-01  编程技术汇  今日头条  Tags:Java   点击:(68)  评论:(0)  加入收藏
Java中的缓存技术及其使用场景
Java中的缓存技术是一种优化手段,用于提高应用程序的性能和响应速度。缓存技术通过将计算结果或者经常访问的数据存储在快速访问的存储介质中,以便下次需要时可以更快地获取。...【详细内容】
2024-01-30  编程技术汇    Tags:Java   点击:(72)  评论:(0)  加入收藏
JDK17 与 JDK11 特性差异浅谈
从 JDK11 到 JDK17 ,Java 的发展经历了一系列重要的里程碑。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性...【详细内容】
2024-01-26  政采云技术  51CTO  Tags:JDK17   点击:(89)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  大雷家吃饭    Tags:Java   点击:(106)  评论:(0)  加入收藏
这篇文章彻底让你了解Java与RPA
前段时间更新系统的时候,发现多了一个名为Power Automate的应用,打开了解后发现是一个自动化应用,根据其描述,可以自动执行所有日常任务,说的还是比较夸张,简单用了下,对于office、...【详细内容】
2024-01-17  Java技术指北  微信公众号  Tags:Java   点击:(97)  评论:(0)  加入收藏
Java 在 2023 年仍然流行的 25 个原因
译者 | 刘汪洋审校 | 重楼学习 Java 的过程中,我意识到在 90 年代末 OOP 正值鼎盛时期,Java 作为能够真正实现这些概念的语言显得尤为突出(尽管我此前学过 C++,但相比 Java 影响...【详细内容】
2024-01-10  刘汪洋  51CTO  Tags:Java   点击:(75)  评论:(0)  加入收藏
站内最新
站内热门
站内头条