Java 8 中 常用的 LocalDateTime 操作

JAVA-LocalDateTime时间格式化,转换时间戳和源码分析(万字长文详解) 这篇文章主要介绍了JAVA8新增的LocalDateTime时间的格式化,和时间戳的互相转换。以及对应的源码分析,有这完整的源码调用链。源码的执行分析。逐行对源码进行了注释,方便大家看懂。万字长文带图带代码示例,一文带你彻底了解时间类型。看完本篇文章,你将获得源码技术++,源码阅读量++,JAVA水平++。对于JAVA源码的解析希望能给你帮助。并提升阅读源码的思维。 阅读详情

引言

Java 开发中,我们常常用到各种格式的时间转换,收集一下

获取当天初始时间

/**
 * 获取传入时间的凌晨 00:00:00
 */
public static LocalDateTime getDayStart(LocalDateTime paramTime) {
    if (null == paramTime) {
        return LocalDateTime.MIN;
    } else {
        return LocalDateTime.of(paramTime.toLocalDate(), LocalTime.MIN);
    }
}

获取当天结束时间

/**
 * 获取传入时间当天最大的时间 23:59:59
 */
public static LocalDateTime getDayEnd(LocalDateTime paramTime) {
    if (null == paramTime) {
        return LocalDateTime.MAX;
    } else {
        return LocalDateTime.of(paramTime.toLocalDate(), LocalTime.MAX);
    }
}

获取时间差

有的时候,根据业务需求,我们会获取例如上个月的时间,或者推迟几分钟、几小时的时间等等,在 java 8之后,官方编写了现成的时间工具可以使用。下面,让我们一起来体验一下吧。

public static void main(String[] args) {
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    System.out.println("当前时间: " + fmt.format(LocalDateTime.now()));
    LocalDateTime time = LocalDateTime.now().minusMinutes(1L);
    System.out.println("获取上一分钟: " + fmt.format(time));
    LocalDateTime nextMin = LocalDateTime.now().plusMinutes(1L);
    System.out.println("获取下一分钟: " + fmt.format(nextMin));
}

输出:

当前时间: 2022-08-01 09:11:16
获取上一分钟: 2022-08-01 09:10:16
获取下一分钟: 2022-08-01 09:12:16

仔细看上述代码,其中最重要的就是minusMinutes,plusMinutes,字面英文大意不难看出这是什么意思,同理可得,我们去看下工具类中,还有哪些方法。

在plusMinutes上右击选择转到,然后选择实现或者声明或用例

然后就会进入到LocalDateTime.java类中,Mac 按快捷键 command + 7,Windows 按快捷键Alt + 7,会显示主体结构。

我们在下图中,可以观测到官方提供了很多现有的方法,基本满足了我们日常的使用。

常用方法简介

方法解释
minusDays减去指定的天数
minusHours减去指定的小时数
minusMinutes减去指定的分钟数
minusSeconds减去指定的秒数
minusNanos减去指定的纳秒数
plusDays增加指定的天数
plusHours增加指定的小时数
plusMinutes增加指定的分钟数
plusSeconds增加指定的秒数
plusNanos增加指定的纳秒数

上面的大多都很好理解,就其中的 minusNanos 减去指定的纳秒数,我们来实践一下:

先来看一下,我们先输出一下当前时间的毫秒:

1 毫秒 = 100万纳秒

public static void main(String[] args) {
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    LocalDateTime current = LocalDateTime.now();
    System.out.println("当前时间: " + fmt.format(current));
    LocalDateTime tempTime = current.minusNanos(100 * 1000000L);
    System.out.println("减去 100 毫秒: " + fmt.format(tempTime));
}

输出:

当前时间: 2022-08-01 10:00:27.800
减去 100 毫秒: 2022-08-01 10:00:27.700

plusNanos与其他相关的方法就不演示了,相信举一反三,同理可得。听懂掌声。

获取自定义时间

现业务需要,需要获取当前小时开始的时间,例如 2022-10-01 10:00:00

public static void main(String[] args) {
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
    LocalDateTime current = LocalDateTime.now();
    System.out.println("当前时间: " + fmt.format(current));
    LocalDateTime tempTime = current.minusNanos(100 * 1000000L);
    tempTime = tempTime.withMinute(0).withSecond(0).withNano(0);
    System.out.println("获取当前时间,除了日期与小时,其余为 0: " + fmt.format(tempTime));
}

输出:

当前时间: 2022-08-01 10:04:06.004
获取当前时间,除了日期与小时,其余为 0: 2022-08-01 10:00:00.000

最主要的代码是:

tempTime = tempTime.withMinute(0).withSecond(0).withNano(0);

tips: tempTime操作完是需要返回值接收的,不然不会改变原有的值。

可以看到用到了三个 with:

方法解释
withMinute设置指定的分钟数
withSecond设置指定的秒数
withNano设置指定的纳秒数

这个时候有人就要玩烧的了,我就要给分钟设置个 61...,我们来试一下,报错如下:

...DateTimeException: Invalid value for MinuteOfHour (valid values 0 - 59): 61

比较时间前与后

现业务需要我们判断传入参数不能大于当前时间,我们如何去做?
通过如下方法加示例搞定:

方法解释
isAfter检查此日期时间是否在指定的日期时间之后
isBefore检查此日期时间是否在指定的日期时间之前
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
LocalDateTime d1 = LocalDateTime.of(2022, 8, 2, 10, 0, 0);
System.out.printf("d1: %s%n", fmt.format(d1));
LocalDateTime d2 = LocalDateTime.of(2022, 8, 1, 10, 0, 0);
System.out.printf("d2: %s%n", fmt.format(d2));
System.out.println("d1.isAfter(d2): " + d1.isAfter(d2));
System.out.println("d1.isBefore(d2): " + d1.isBefore(d2));

输出:

d1: 2022-08-02 10:00:00.000
d2: 2022-08-01 10:00:00.000
d1.isAfter(d2): true
d1.isBefore(d2): false
Java8 LocalDate LocalTime LocalDateTime的使用 log.info("2023-05-15 与 2023-05-20 isBefore 比较: {}, 2023-05-20 与 2023-05-15 isBefore 比较: {}", isBefore, isBefore2);log.info("2023-05-15 与 2023-05-10 isAfter 比较: {}, 2023-05-10 与 2023-05-15 isAfter 比较: {}", isAfter, isAfter2);// 月底的最后一天,增加1个月, 到下个月的月底的最后一天。 阅读详情

相关推荐

LocalDateTime类常用的方法介绍

LocalDateTime类的一些常用API和方法的概述。

u013558123的博客 1025

【LocalDateTime常见用法】

简单记录下LocalDateTime常见用法

qq_41027259的博客 9040

LinuxCNC 源码解析:从界面开发到硬件交互的实战指南

本文深入解析LinuxCNC源码架构,从用户界面开发到硬件交互的实战指南。涵盖GTK与Tkinter界面开发、HAL硬件抽象层、G代码解析器改造及运动控制核心等关键模块,提供定制化开发技巧与性能优化方案,助力开发者高效掌握数控系统开发。

weixin_27066963的博客 190

Java时间操作

为什么不使用Date 不进行格式化,打印的时间可读性差 SimpleDateFormat线程不安全 操作时间不方便 新时间日期API常用、重要对象介绍 ZoneId: 时区ID,用来确定Instant和LocalDateTime互相转换的规则 Instant: 用来表示时间线上的一个点(瞬时) LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的 LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的 LocalDateTime: 表示没有时

善意的小菜鸟的博客 3127

OpenClaw:深度学习驱动的智能编程工具实战解析

智能编程工具通过深度学习技术革新传统开发流程,其核心在于代码语义理解与实时协作能力。这类工具采用AI代码补全、错误预测等技术,显著降低开发者认知负荷,尤其适用于复杂业务逻辑开发和遗留系统维护场景。以OpenClaw为例,其智能填充和上下文感知功能可提升40%编码效率,减少65%调试时间。关键技术实现包含自然语言处理、代码静态分析等,在金融科技、电商系统等领域具有广泛应用前景。热词提示:代码理解引擎、智能工作流整合展现了当前AI辅助开发的最新趋势。

chubaisheng8627的博客 320

Rocky Linux 9.2:利用LVM动态调整/home与/根分区空间分配

本文详细介绍了在Rocky Linux 9.2系统中,如何利用LVM(逻辑卷管理器)动态调整/home与根分区(/)的空间分配。针对根分区空间不足而/home分区闲置的常见问题,文章提供了从检查磁盘布局、备份数据、卸载分区、调整逻辑卷大小到重建文件系统的完整操作步骤,并重点说明了XFS与EXT4文件系统在缩容时的不同处理方法,帮助系统管理员安全、在线地实现存储空间的灵活调配。

weixin_29271263的博客 177

【JAVA】Java8对时间的一些常用操作记录。例如:LocalDateTime、ZoneId等。

Java.time(jdk1.8)包下的一些使用记录(不完全,随用随加) 小知识 LocalDateTime: java.time.LocalDateTime类表示ISO-8601日历系统中没有时区的日期时间,例如2007-12-03T10:15:30。表示与时区无关的日期和时间信息,不直接对应时刻,需要通过时区转换. Instant:java.time.Instant类在时间线上模拟单个瞬时点。不直接对应年月日信息,需要通过时区转换. LocalDate:java.time.LocalDate类表示IS

我想写点儿啥,写点儿啥呢,就写点啥。 378

从仿真到实战:PMOS缓启动与栅极泄放电路的优化设计

本文深入探讨了PMOS缓启动与栅极泄放电路的优化设计,通过立创EDA仿真和实物调试,解决了关断速度慢和耐压问题。文章详细介绍了电路改进方案和低功耗优化技巧,为工程师提供了实用的工程实践建议,帮助提升电源开关电路的性能和可靠性。

weixin_28721917的博客 259

Java8常用时间方法(LocalDateTime操作)

Java8常用时间方法(LocalDateTime操作) import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Period; import java.time.format.DateTimeFormatter; public class java8Time { public static void main(String[] args) {

weixin_41612174的博客 1247

《UDS协议从入门到精通》系列——图解0x2E:通过ID写数据

图解数据包格式+直观的通信示例,迅速认识0x2E服务!!

车载系统攻城狮 3602

【报错解决】彻底解决 MySQL 登录报错 ERROR 1045 (28000)

MySQL 报错 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES) 通常是由于用户名或密码错误、权限不足、服务未启动或配置文件异常导致的。通过检查并确认密码、重置 root 用户密码、授予完整权限、校验配置文件以及确保 MySQL 服务正常运行,可以彻底解决该问题。掌握这一流程不仅能够恢复 root 登录,还能保障数据库的安全性与稳定性。

博客 1749

Java8时间常用操作

一、Java8时间常用操作 前言:时间操作在开发中经常被使用到,最近项目是用Java8开发,因此总结一下时间操作常用方法。 1.常用方法总结 1.1.获取当前时间 // 当前日期:2019-03-16 LocalDate date = LocalDate.now(); // 当前时间:22:13:03.450 LocalTime time = Loca...

疾风知劲草,智者必怀仁 315

大模型安全-生成检测-事实核查-攻击-防御-思考-记忆-融合-语音相关研究 2025年版

本文整理了关于大模型安全领域的综合性资源,包括7篇综述论文、9个安全数据集以及5篇强化学习相关的安全研究论文。主要涉及大模型的对抗攻击、隐私保护、安全评估等方向,涵盖TruthfulQA、ToxiGen等知名数据集和TrustLLM、HarmBench等关键研究。资源包括知乎博主分享、arXiv预印本和顶会论文,并附有详细的中文讲解链接,为研究者提供了系统性的安全研究参考。

CSPhD-winston的博客 3582

Java8 LocalDateTime常用方法

【代码】Java8 LocalDateTime常用方法。

weixin_45131680的博客 516

STM32入门教程:车牌识别

在本文中,我们介绍了如何使用STM32实现车牌识别功能,并提供了详细的代码案例。通过以上步骤,你可以开始开发自己的车牌识别系统了。希望本文对你有所帮助!

2401_85258012的博客 874

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

详细分析Java中的LocalDateTime类

一开始使用Date类来表述时间属性,一个问题是 时间戳的问题,另一个问题是读取Excel数据格式的时候没有那么灵活

码农研究僧的博客 1万+

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java 8日期时间类LocalDate、LocalDateTime详解

Java 8日期时间类LocalDate、LocalDateTime常见API、互相转换

hupei 2289

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

localdatetime 后一天_Java8 LocalDateTime极简时间日期操作小结

简述时间日期处理是平时工作中使用非常频繁的逻辑,Java8中提供的新的时间类LocalDateTime和LocalDate,使日期处理可以更简单。友情提醒下,业务开发中最好默认使用LocalDateTime,因为LocalDateTime可以很方便的转换为LocalDate,但是LocalDate是不可以转为LocalDateTime的,会没有时分秒的数据!!!本篇文章整理了常用的日期处理获取方式...

weixin_39968410的博客 1878

localdatetime 获取天_Java8 LocalDateTime极简时间日期操作小结

简述时间日期处理是平时工作中使用非常频繁的逻辑,Java8中提供的新的时间类LocalDateTime和LocalDate,使日期处理可以更简单。友情提醒下,业务开发中最好默认使用LocalDateTime,因为LocalDateTime可以很方便的转换为LocalDate,但是LocalDate是不可以转为LocalDateTime的,会没有时分秒的数据!!!本篇文章整理了常用的日期处理获取方式...

weixin_39675728的博客 2142

Java 8+时间处理:LocalDateTime、LocalDate、LocalTime 深度解析

在 Java 8 之前,时间和日期的处理主要依赖于和。DateCalendarDateCalendar为了解决这些问题,Java 8 引入了新的时间日期 API(java.time包),该包采用了更现代的设计并且线程安全。LocalDate和LocalTime,并结合具体实例说明它们的使用方法和最佳实践。

WenZhang的博客 5658

java 中date类常用方法

1、Date 代表一个特定的时间,精确到毫秒; 方法名 说明 public Date() 创建一个Date对象,表示默认时间;把当前时间封装成Date对象 public Date(long date) 创建一个Date对象,表示指定时间; (1)date类常用方法 方法名 说明 public long getTime()

qq_40808896的博客 6513

localdatetime转化为long_java8新特性-Stream与LocalDateTime

1. JAVA8的Streamstream现在是越用越多了,还是不是太熟练,简单记录下,经常使用的是map与filtermap简单数就是处理,方法用于映射每个元素到对应的结果,以下代码片段使用map输出了元素对应的平方数:Listnumbers=Arrays.asList(1,2,3,4,5);ListsquaresList=numbers.stream().map(...

weixin_28696185的博客 2455

Java8中LocalDate、LocalTime和LocalDateTime时间类的使用

Java8中LocalDate、LocalTime和LocalDateTime时间类的详细使用

Guo_Programmer的博客 4069

Java时间旅行者指南:掌握LocalDate、LocalDateTime、Instant、Duration和Period等

LocalDate和类提供了丰富的方法,但在实际开发场景中,面对特定的问题时,本人和在座的大佬可能会暂时遗忘如何使用相关的 API。因此,这里汇总了常用和较少用到的方法,以便快速参考。

qq_37834811的博客 1380
上一篇: 你会用Java抠图吗?【图像处理】获取用户感兴趣的区域
下一篇: 阿里巴巴的Netty面试题到底有多难,这些知识你能掌握多少?
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值