当前位置 : 主页 > 编程语言 > java >

Java 8 中 常用的 LocalDateTime 操作

来源:互联网 收集:自由互联 发布时间:2022-08-10
引言 Java 开发中,我们常常用到各种格式的时间转换,收集一下 获取当天初始时间 /** * 获取传入时间的凌晨 00:00:00 */public static LocalDateTime getDayStart(LocalDateTime paramTime) { if (null == paramT

引言

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上右击选择转到,然后选择实现或者声明或用例

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

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

常用方法简介

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

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

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

image.png 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
上一篇:xgboost 加速
下一篇:没有了
网友评论