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

目录

一.引言

二.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 是线程安全的

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文读懂域名注册

本文深入浅出讲解域名的注册、建站和管理,通过文章可以了解以下问题: 域名注册及建站流程;域名注册的技术原理;域名管理(修改 DNS 服务器、转入转出、自定义 DNSHost、whois 信息)。 众所周知,…

轨迹相似度整理

1 基于点之间的距离 1.1 欧几里得距离 优点:线性计算时间缺点:轨迹长度必须一样 1.2 DTW DTW 笔记: Dynamic Time Warping 动态时间规整 (&DTW的python实现) 【DDTW,WDTW】_UQI-LIUWJ的博客-CSDN博客 …

限流算法(计数器、滑动时间窗口、漏斗、令牌)原理以及代码实现

文章目录前言1、计数器(固定时间窗口)算法原理代码实现存在的问题2、滑动时间窗口算法原理代码实现存在的问题3、漏桶算法原理代码实现存在的问题4、令牌桶算法原理代码实现最后本文会对这4个限流算法进行详细说明,并输出实现限流算法的代码示…

【Redis笔记03】Redis运行环境之Cluster集群模式

这篇文章,主要介绍Redis运行环境之Cluster集群模式。 目录 一、Cluster集群模式 1.1、集群模式原理 (1)普通集群 (2)什么是分片??? (3)如何分片存储&…

【操作系统复习】第4章 进程同步

进程同步的概念 主要任务 ➢ 使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。 进程间的制约关系 ➢ 间接相互制约关系(互斥关系) • 进程互斥使用临界资源 ➢ 直接相互制约关系(同步关系) •…

在线绘制思维导图

思维导图是一种可视化的思维工具,它可以将放射性思考具体化为可视的图像和图表。 思维导图利用图文并重的技巧,把各级主题的关系用相互隶属与相关的层级图表现出来,把主题关键词与图像、颜色等建立记忆链接。 它运用图像和颜色等多种元素&…

真题详解(Flynn分类)-软件设计(四十六)

真题详解(计算机总线)-软件设计(四十五)https://blog.csdn.net/ke1ying/article/details/130046829 Flynn分类将计算机分为四类。 单指令流单数据流机器(SISD):早期的机器,在某个时钟周期&…

某程序员哀叹:月薪四五万,却每天极度焦虑痛苦,已有生理性不适,又不敢裸辞,怎么办?...

高薪能买来快乐吗?来看看这位程序员的哀叹:实在是扛不住了,每天都在极度焦虑和痛苦中度过,早上起来要挣扎着做心理建设去上班,已经产生生理性的头晕恶心食欲不振。有工作本身的原因,更多是自己心态的问题&a…

商务接待广州考斯特商务租车详解!

进入四月份以来,全国各个地区都有很多商务活动举办,广州也不例外,广州很多地区都有商务活动的需求。因此不少主办方都需要商务租车来接待客户,而丰田考斯特是市面上常见的一款高端中巴车,主要是因为考斯特的可靠性、安…

CentOs的环境和配置

centos如果我们想要登录怎么办? 我们可以使用Xshell的远程登录 就像这样 这个就是Xshell远程登录,我们可以ssh root你的主机ip 然后输入密码就可以登录 就像这样 然后输入你的密码 就登录上来了,然后就可以进行你的操作 但是我们还可以直…

Flink 优化 (一) --------- 资源配置调优

目录一、内存设置1. TaskManager 内存模型2. 生产资源配置示例二、合理利用 cpu 资源1. 使用 DefaultResourceCalculator 策略2. 使用 DominantResourceCalculator 策略3 使用 DominantResourceCalculator 策略并指定容器 vcore 数三、并行度设置1. 全局并行度计算2. Source 端…

谷歌云服务器centos9的docker部署chat-web,实现自己的ChatGPT

谷歌云服务器centos9的docker部署chat-web,实现自己的ChatGPT 前提条件:准备一个境外服务器和chatgpt的key。(网上教程很多) 1.更新yum yum update2.下载docker-ce的repo curl https://download.docker.com/linux/centos/dock…

【iOS开发-响应者链Responder Chain】

文章目录0.0 前言1 响应者链(Responder Chain1.1 响应者1.2 响应链事件1.3 响应者对象1.3.1 常见的响应者对象1.3.3 UIResponder1.3 UITouch1.3.1 UITouch的属性1.3.2 UITouch的方法1.4 UIEvent1.4.2 获取touch1.5 完整的响应者链1.5.1寻找响应者的hitTest方法1.5.2…

excel在文本的固定位置插入字符、进行日期和时间的合并

1.excel在文本的固定位置插入字符 如上图,现在想要将其转化为日期格式(比如2017/1/1),但是当设置单元格格式为日期时却显示出很多#。我们可以通过在20170101中添加两个斜杠“/”来将其转化为2017/1/1。可以用replace函…

【分享】如何移除PDF密码?

相信不少小伙伴在工作的时候,经常会为了保证PDF文档的安全和私密而给文件设置“打开密码”,但如果后续需要频繁使用该文件,每次打开都要查找输入密码,就会使得工作效率大大降低耽误工作时间。那后续不需要设置保护了,要…

如何用ChatGPT写文章?只需要这3步,10倍提升写作效率

随着技术的不断进步和创新,我们的生活方式和工作方式也在不断变化。在日常工作中,越来越多的人使用人工智能和机器学习等技术提高效率减少时间成本。最近ChatGPT火出圈了,很多人通过使用ChatGPT提高了工作效率。那么,在写作领域&a…

【C++ 三】一维数组、二维数组

数组概述、一维数组、二维数组 文章目录数组概述、一维数组、二维数组前言1 数组1.1 概述2 一维数组2.1 一维数组定义方式2.2 一维数组数组名2.3 冒泡排序3 二维数组3.1 二维数组定义方式3.2 二维数组数组名总结前言 本文包含数组概述、一维数组、二维数组。 1 数组 1.1 概述…

Jina AI 创始人肖涵博士:揭秘 Auto-GPT 喧嚣背后的残酷真相

Auto-GPT 究竟是一个开创性的项目,还是一个被过度炒作的 AI 实验?本文为我们揭开了喧嚣背后的真相,并揭示了 Auto-GPT 不适合实际应用的生产局限性。 背景介绍 这两天,Auto-GPT,一款让最强语言模型 GPT-4 能够自主完成…

口令暴力破解--Ftp协议暴力破解与Ssh协议暴力破解

Ftp协议暴力破解 FTP服务检测 FTP服务 FTP是一种文件传输协议, FTP服务默认端口为21。利用FTP服务器可以在本地主机和远程主机间进行文件传输。当FTP没有配置好安全控制,如对登录的源地址及密码尝试次数做限制,那么就会存在暴力破解可能。…

计算机网络

文章目录数据传输过程及接收过程应用层传输层TCP/IP4层网络模型 1.应用层 2.传输层 3.网络层 4.数据链路层 数据传输过程及接收过程 用户A在聊天软件上输入hello world按下发送,发送给B 一: 传输 1.应用层:构建一个应用层的数据报文交给传输层 ** 2.传输层: 根据刚才传过来的…