Scala - 时间工具类 LocalDateTime 常用方法整理

news2024/11/21 0:18:10

目录

一.引言

二.LocalDateTime 获取与格式化

1.获取当前时间 LocalDateTime

2.根据时间戳获取 LocalDateTime

3.指定时间获取 LocalDataTime

4.LocalDataTime 格式化

三.LocalDateTime 读取时间细节

1.获取年-Year

2.获取月-Month

3.获取日-Day

4.获取时-Hour

5.获取分-Minute

6.获取秒-Second

7.获取时间戳-TimeStamp

8.TimeUtil 工具类

四.LocalDateTime 修改

1.加一年

2.加一月

3.加一天

4.通过 `with` 修改

4.1 指定年份

4.2  firstDayOfYear 今年第一天

4.3 dayOfWeekInMonth 本月的第几个周几

4.4 firstDayOfMonth 当月第一天

4.5 firstDayOfNextMonth 下月第一天

4.6 firstDayOfNextYear 明年第一天

4.7 firstInMonth 本月第一个周几

4.8 lastDayOfYear 本年最后一天

4.9 lastInMonth 本月最后一个周几

4.10 next 下一个周几

4.11 previous 上一个周几

4.12 nextOrSame 下一个周几且是否当日

4.13 previousOrSame 上一个周几且是否当日

五.LocalDateTime 与时间间隔 Duration

1.差几天

2.差几小时

3.差几分钟

4.差几秒

5.差几毫秒

6.差几纳秒

7.DurationUtil 工具类

六.总结


一.引言

开发中遇到需要判断是否周末即 is_weekend 的逻辑需求,这里使用 LocalDateTime 解决问题并记录下该类的其他用法,方便后续查阅。

import java.time.format.DateTimeFormatter

二.LocalDateTime 获取与格式化

首先介绍如何生成 LocalDateTime 类。

1.获取当前时间 LocalDateTime

该方法开发环境中比较常见,一般是 Object 内加载一次获取当前相关的时间语义状态。

    // 获取当前时间
    val localDateTime = LocalDateTime.now()
2023-04-11T14:09:17.712

2.根据时间戳获取 LocalDateTime

多见于数据分析,将日志中的时间戳转化并统计相关指标。实际分析时将时间戳换成自己的时间戳即可。

    val currentTimeStamp = System.currentTimeMillis() / 1000
    val localDateTimeByTs = LocalDateTime.ofEpochSecond(currentTimeStamp, 0, ZoneOffset.ofHours(8))
2023-04-11T14:12:25

3.指定时间获取 LocalDataTime

LocalDateTime 提供方法可以直接指定年月日、小时分钟秒...

    val localDateTimeByAssign = LocalDateTime.of(2023, 3, 5, 10, 20, 30)

下面指定 2023 年 3 月 5 日 10 点 20 分 30 秒:

2023-03-05T10:20:30

4.LocalDataTime 格式化

格式化多见于日志输出,因为 '2023-03-05T10:20:30' 这样的字符串并不适合我们任务解析与标识,大家可以自定义不同的格式化在 ofPattern 中。

    val localDateTime = LocalDateTime.now()
    val dateTimeFormat = DateTimeFormatter.ofPattern("yyyyMMddHHmm")
    val dataTimeFormatV2 = DateTimeFormatter.ofPattern("yyyy-MM-dd")
    println(dateTimeFormat.format(localDateTime))
    println(dataTimeFormatV2.format(localDateTime))
202304111416
2023-04-11

三.LocalDateTime 读取时间细节

import java.time.temporal.{ChronoField, ChronoUnit}

// 获取当前时间
val localDateTime = LocalDateTime.now()

1.获取年-Year

    val year = localDateTime.getYear
    val year2 = localDateTime.get(ChronoField.YEAR)

2.获取月-Month

    val month = localDateTime.getMonth
    val month2 = localDateTime.get(ChronoField.MONTH_OF_YEAR)

这里推荐大家使用第二种,第一种 getMonth 返回的是 Month 类,打印结果为: "APRIL" 而不是 Int 的月份。

3.获取日-Day

    val dayOfMonth = localDateTime.get(ChronoField.DAY_OF_MONTH)
    val dayOfWeek = localDateTime.get(ChronoField.DAY_OF_WEEK)

DAY_OF_MONTH 是这个月的第几天即我们常说的今天几号

DAY_OF_WEEK 是当前周的第几天及我们常说的今天周几,其范围为 1-7,博主的需求其实用到了这一行就够了,is_weekend 判断 dayOfWeek 是不是 6-7 即可。

4.获取时-Hour

    val hour = localDateTime.get(ChronoField.HOUR_OF_DAY)

5.获取分-Minute

    val minute = localDateTime.get(ChronoField.MINUTE_OF_HOUR)

6.获取秒-Second

    val second = localDateTime.get(ChronoField.SECOND_OF_MINUTE)

7.获取时间戳-TimeStamp

    val localDateTime = LocalDateTime.now()
    println(localDateTime.toEpochSecond(ZoneOffset.ofHours(8)))
1681195918

如果需要毫秒形式需要补 000

8.TimeUtil 工具类

  def getTimeDetail(isNow: Boolean): mutable.HashMap[String, Int] = {

    val timeMap = mutable.HashMap[String, Int]()

    // 获取当前时间
    val localDateTime = LocalDateTime.now()

    val year = localDateTime.getYear
    val year2 = localDateTime.get(ChronoField.YEAR)

    val month = localDateTime.getMonth
    val month2 = localDateTime.get(ChronoField.MONTH_OF_YEAR)

    val dayOfMonth = localDateTime.get(ChronoField.DAY_OF_MONTH)
    val dayOfWeek = localDateTime.get(ChronoField.DAY_OF_WEEK)

    val isWeekend = if (dayOfWeek.equals(6) || dayOfWeek.equals(7)) 1 else 0

    val hour = localDateTime.get(ChronoField.HOUR_OF_DAY)
    val minute = localDateTime.get(ChronoField.MINUTE_OF_HOUR)
    val second = localDateTime.get(ChronoField.SECOND_OF_MINUTE)

    timeMap.put("year", year)
    timeMap.put("month", month2)
    timeMap.put("day", dayOfMonth)
    timeMap.put("week", dayOfWeek)
    timeMap.put("hour", hour)
    timeMap.put("minute", minute)
    timeMap.put("second", second)
    timeMap.put("isWeekend", isWeekend)

    println(s"年 $year $year2 月: $month  月: $month2 日期: $dayOfMonth  周: $dayOfWeek")

    timeMap
  }

直接调用该方法获取全部所需时间信息: 

Map(second -> 6, hour -> 14, week -> 2, year -> 2023, minute -> 53, month -> 4, isWeekend -> 0, day -> 11)

四.LocalDateTime 修改

除了获取指定时间 LocaDateTime 外,有时候还需要对时间做适当修改。

1.加一年

    val plusYearV1 = localDateTime.plusYears(1)
    val plusYearV2 = localDateTime.plus(1, ChronoUnit.YEARS)
2024-04-11T14:59:40.311

2.加一月

    // 加一月
    val plusMonthV1 = localDateTime.plusMonths(1)
    val plusMonthV2 = localDateTime.minus(1, ChronoUnit.MONTHS)

3.加一天

    val plusDayV1 = localDateTime.plusDays(1)
    val plusDayV2 = localDateTime.plus(1, ChronoUnit.DAYS)

4.通过 `with` 修改

4.1 指定年份

    val withYearV1 = localDateTime.withYear(2021)
    val withYearV2 = localDateTime.`with`(ChronoField.YEAR, 2020)

4.2  firstDayOfYear 今年第一天

    println(localDateTime.`with`(firstDayOfYear))
    2023-01-01T15:11:32.817

4.3 dayOfWeekInMonth 本月的第几个周几

返回本月的第一个周五:

    println(localDateTime.`with`(dayOfWeekInMonth(1, DayOfWeek.FRIDAY)))
    2023-04-07T15:16:02.061

返回本月的最后一个周一:

    println(localDateTime.`with`(dayOfWeekInMonth(-1, DayOfWeek.MONDAY)))
    2023-04-24T15:18:31.713

 

4.4 firstDayOfMonth 当月第一天

    println(localDateTime.`with`(firstDayOfMonth()))
    2023-04-01T15:20:29.200

4.5 firstDayOfNextMonth 下月第一天

    println(localDateTime.`with`(firstDayOfNextMonth()))
    2023-05-01T15:20:51.163

4.6 firstDayOfNextYear 明年第一天

    println(localDateTime.`with`(firstDayOfNextYear()))
    2024-01-01T15:21:31.954

4.7 firstInMonth 本月第一个周几

本月第一个周五

    println(localDateTime.`with`(firstInMonth(DayOfWeek.FRIDAY)))
    2023-04-07T15:22:26.534

4.8 lastDayOfYear 本年最后一天

    println(localDateTime.`with`(lastDayOfYear))
    2023-12-31T15:24:25.833

 

4.9 lastInMonth 本月最后一个周几

本月最后一个周一

    println(localDateTime.`with`(lastInMonth(DayOfWeek.MONDAY)))
    2023-04-24T15:25:26.660

4.10 next 下一个周几

下一个周一

    println(localDateTime.`with`(next(DayOfWeek.MONDAY)))
    2023-04-17T15:26:42.145

4.11 previous 上一个周几

上一个周五

    println(localDateTime.`with`(previous(DayOfWeek.FRIDAY)))
    2023-04-07T15:27:26.763

4.12 nextOrSame 下一个周几且是否当日

下一个周五,不是当日所以正常返回

    println(localDateTime.`with`(nextOrSame(DayOfWeek.FRIDAY)))
    2023-04-14T15:29:15.985

下一个周二,是当日所以返回当前日期即命中了 Same

    println(localDateTime.`with`(nextOrSame(DayOfWeek.TUESDAY)))
    2023-04-11T15:30:20.639

这里 nextOrSame 和 next 可以看作是大于等于和大于的区别。

4.13 previousOrSame 上一个周几且是否当日

上一个周五

    println(localDateTime.`with`(previousOrSame(DayOfWeek.FRIDAY)))
    2023-04-07T15:31:55.037

上一个周二

    println(localDateTime.`with`(previousOrSame(DayOfWeek.TUESDAY)))
    2023-04-11T15:31:30.415

和上面的 nextOrSame 同理,这里 previouesOrSame 和 previous 可以看作是小于等于和小于的区别。

五.LocalDateTime 与时间间隔 Duration

Duration 与 LocalDateTime 集合可以计算两个时间类之间的差距。

    val from = LocalDateTime.of(2022, 1, 1, 0, 0, 0)
    val to = LocalDateTime.of(2023, 1, 1, 0, 0, 0)
    val duration = Duration.between(from, to)

1.差几天

    val days = duration.toDays

2.差几小时

    val hours = duration.toHours

3.差几分钟

    val minutes = duration.toMinutes

4.差几秒

    val seconds = duration.getSeconds

5.差几毫秒

    val milliSeconds = duration.toMillis

6.差几纳秒

    val nanoSeconds = duration.toNanos

7.DurationUtil 工具类

  def timeDuration(): Unit = {

    val from = LocalDateTime.of(2022, 1, 1, 0, 0, 0)
    val to = LocalDateTime.of(2023, 1, 1, 0, 0, 0)
    val duration = Duration.between(from, to)
    // 间隔内的 总天数 小时数 分钟数 秒数 毫秒数 纳秒数
    val days = duration.toDays
    val hours = duration.toHours
    val minutes = duration.toMinutes
    val seconds = duration.getSeconds
    val milliSeconds = duration.toMillis
    val nanoSeconds = duration.toNanos

    println(days, hours, minutes, seconds, milliSeconds, nanoSeconds)
  }

直接调用方法获取全部 Duration:

(365,8760,525600,31536000,31536000000,31536000000000000)

六.总结

• Duration 可以便捷得到两个 LocalDateTime 之间的间隔信息

• LocalDateTime 可以获取年、月、日,下一个年、月、日等

• LocalTime 相比 LocalDateTime 无法获取更细粒度的秒信息

• TemporalAdjusters 内含多个时间函数静态方法,可以按需调用

• ChronoField 包含多类型时间字段,除上面介绍外,还有 AM、PM 类型时间获取

• ChronoUnit 主要为时间单位,例如 YEARS、MONTHS、DAYS 等等

• 与 SimpleDataFormat 相比,DateTimeFormatter 是线程安全的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/421957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3+vite2 博客前端开发

Vue3vite2 博客前端开发 文章目录Vue3vite2 博客前端开发前言页面展示代码设计卡片设计背景(Particles.js粒子效果)右侧个人信息与公告内容页友链总结前言 大家是否也想拥有一个属于自己的博客?但是如何去开发博客,怎样去开发一个…

新一代AI带来更大想象空间!上海将打造元宇宙超级场景!

引子 上海市经信委主任吴金城4月12日在“2023上海民生访谈”节目表示,上海将着力建设元宇宙智慧医院、前滩东体元宇宙、张江数字孪生未来之城等元宇宙超级场景。 吴金城说,新一代人工智能将带来更大的想象空间。比如,人工智能和元宇宙数字人的…

实验7---myBatis和Spring整合

实验七 myBatis和Spring整合 一、实验目的及任务 通过该实验,掌握mybatis和spring整合方法,掌握生成mapper实现类的两种生成方式。 二、实验环境及条件 主机操作系统为Win10,Tomcat,j2sdk1.6或以上版本。 三、实验实施步骤 略 四、实验报告内…

wait()、sleep()、notify()的解析

wait()、sleep()、notify()的解析 【🎈问题1】:wait()、sleep()、notify()有什么作用?【🎈问题2】:wait()、sleep()的区别?【🎈问题3】:为什么 wait() 方法不定义在 Thread 中&…

九龙证券|今年最贵新股来了,本周还有超低价新股可申购

本周(4月17日—4月21日),截至现在,共有3只新股将进行申购,别离为科创板的晶合集成、创业板的三博脑科、北交所的华原股份。其间华原股份将于周一申购,发行价为3.93元/股,晶合集成将于周四申购&a…

全国青少年软件编程(Scratch)等级考试一级考试真题2023年3月——持续更新.....

一、单选题(共25题,共50分) 1. 下列说法不正确的是?( ) A.可以从声音库中随机导入声音 B.可以录制自己的声音上传 C.可以修改声音的大小 D.不能修改声音的速度 试题解析:针对声音可以进行导入,上传&…

Android 不同分辨率下的Drawable尺寸资源设置

启动器图标 36x36 (0.75x) 用于低密度48x48(1.0x 基线)用于中密度72x72 (1.5x) 用于高密度96x96 (2.0x) 用于超高密度144x144 (3.0x) 用于超超高密度192x192 (4.0x) 用于超超超高密度(仅限启动器图标;请参阅上面的 注&#xff09…

redis 主从模式、哨兵模式、cluster模式的区别

参考: ​https://blog.csdn.net/qq_41071876/category_11284995.html https://blog.csdn.net/weixin_45821811/article/details/119421774 https://blog.csdn.net/weixin_43001336/article/details/122816402 Redis有三种模式,分别是:主…

【C++】STL——用一个哈希表封装出unordered_map和unordered_set

用一个哈希表(桶)封装出unordered_map和unordered_set 文章目录用一个哈希表(桶)封装出unordered_map和unordered_set一、哈希表源码二、哈希函数模板参数的控制三、对上层容器构建仿函数便于后续映射四、string类型无法取模问题五、哈希表默认成员函数实现1.构造函数2.拷贝构造…

【JavaEE】ConcurrentHashMap与Hashtable有什么区别?

博主简介:努力的打工人一枚博主主页:xyk:所属专栏: JavaEE初阶Hashtable、ConcurrentHashMap是使用频率较高的数据结构,它们都是以key-value的形式来存储数据,且都实现了Map接口,日常开发中很多人对其二者之间的区别并…

Jmeter实验

Jmeter实验 启动Jmeter 点击bin目录下的,jmeter进行启动 修改界面语言为中文 发起一个最基本的请求 线程组,Http请求,察看结果树 察看结果树的作用范围 设置请求跟随重定向 响应断言-响应文本 判断响应文本中是否有"百度一…

Scala大数据开发

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Scala简述 在此,简要介绍 Scala 的基本信息和情况。 Scala释义 Scala 源自于英语单词scalable,表示可伸缩的、可扩展的含义。 Scala作者 Scala编…

UDS介绍

首先要有网络网络七层的概念: 学习链接: 七层网络模型-CSDN博客 UDS网络层/TP层(ISO 15765-2)的解读 - 知乎 (zhihu.com) 概念: UDS(Unified Diagnostic Services,统一的诊断服务。 标准名是《…

【栈和队列高频考点题】

目录 1 与栈有关的考题 1.1 最小栈 1.2 栈的弹出压入序列 1.3 逆波兰表达式求值 1.4 二叉树的最近公共祖先 1.5 单调栈 2 与队列有关的考题 2.1 二叉树的分层遍历 2.2 滑动窗口 1 与栈有关的考题 1.1 最小栈 题目描述: 解题思路: 要想在O(1…

微信小程序引入 vant ui组件

1.初始化 在小程序根目录(app.js所在目录),打开cmd命令窗口 npm init -y参数 -y 表示对 npm 要求提供的信息,都自动按下回车键,表示接受默认值。 2.下载miniprogram依赖 通过 npm 安装: npm i vant/weapp -S --p…

京东开源RaftKeeper性能超越ZooKeeper!

一、背景介绍 成百上千台服务器组成的分布式系统中,服务器故障或网络抖动会随时发生,有时会导致严重的系统崩溃,为解决如上问题,雅虎开源了ZooKeeper分布式协调服务并在2010年成为Apache顶级项目,是Hadoop、HBase和Cl…

为什么FTP会随着时间的过去而变慢?

有人问:我在XP上有FZ客户端3.5.3,在Vista上有0.9.41服务器。通过已经很慢的连接传输大文件时,我注意到速度开始时约为40kb / s,但逐渐趋于稳定,约为20kb / s,并保持这种状态。如果我退出客户端并重新启动它…

夜天之书 #81 大厂开源之殇

本轮开源之风吹起迄今数年,最大的影响还是越来越多的商业公司开始探索开源方法能够如何改变自己的经营策略。开源策略循序渐进分成使用、参与和发起。在发起开源项目实践一线的,一个是打着开源旗号的创业公司,另一个就是大型企业尤其互联网企…

JUC并发编程之AQS原理

1. AQS 原理 1.1 概述 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架 特点: 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个生态,控制如何获…

剪枝与重参第六课:基于VGG的模型剪枝实战

目录基于VGG的模型剪枝实战前言1.Intro2.Prune实战2.1 说明2.2 test()2.3 加载稀疏训练模型2.4 前处理2.5 建立新模型并存储信息2.6 BatchNorm层的剪枝2.7 Conv2d的剪枝2.8 Linear的剪枝3.基于VGG的模型剪枝总结基于VGG的模型剪枝实战 前言 手写AI推出的全新模型剪枝与重参课程…