Kotlin的datetime库

kotlinx 是一组不是 Kotlin 标准库一部分,但非常实用的扩展项目集合。其中,kotlinx-datetime 是一个跨平台的 Kotlin 时间日期处理库。


如何在项目中使用该库

Gradle 项目中

repositories 块中添加 Maven Central 仓库:

repositories {mavenCentral()
}

说明:告诉 Gradle 在 Maven Central 仓库中查找依赖。

然后在 dependencies 块中添加依赖(以版本 0.4.0 为例):

dependencies {implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
}

说明:将 kotlinx-datetime 库作为实现依赖加入项目。


Maven 项目中

添加如下依赖:

<dependency><groupId>org.jetbrains.kotlinx</groupId><artifactId>kotlinx-datetime-jvm</artifactId><version>0.4.0</version>
</dependency>

说明:Maven 中的依赖声明,版本号同样为 0.4.0。


在源文件中导入时间处理包:

import kotlinx.datetime.*

说明:引入库中所有时间相关的类和函数。


Instant(瞬时点)介绍

Instant 表示时间线上某个具体的时刻,常用于比较两个时间点或存储时间戳。


创建 Instant 对象

创建 Instant 的实例非常简单
你可以使用该now()方法获取当前日期和时间,如下所示:

import kotlinx.datetime.Clockfun main() {val currentInstant = Clock.System.now()println(currentInstant) // 例如输出:2023-07-24T13:39:16.310148200Z
}

说明Clock.System.now() 获取当前 UTC 时间的 Instant


转换为毫秒时间戳

如果你需要以毫秒为单位的时间,可以使用.toEpochMilliseconds()

val currentInstantInMillisec = currentInstant.toEpochMilliseconds()

说明toEpochMilliseconds() 返回当前时间点自 Unix 纪元(1970-01-01T00:00:00Z)以来的毫秒数。


从毫秒时间戳创建 Instant

或者fromEpochMilliseconds()基于毫秒创建实例

val specificInstant = Instant.fromEpochMilliseconds(currentInstantInMillisec)

说明:通过毫秒时间戳反向创建 Instant 对象。


Instant 的加减操作

可以使用 plus()minus()Instant 加上或减去一定的时间段(Duration):

import kotlin.time.Durationval futureInstant = currentInstant.plus(Duration.parse("6h"))   // 当前时间加6小时
val pastInstant = currentInstant.minus(Duration.parse("24h"))   // 当前时间减24小时

Instant 和其他日期时间类型的转换

即时可以轻松转换为其他日期和时间类型,反之亦然

val zonedDateTime = currentInstant.toLocalDateTime(TimeZone.currentSystemDefault())
val backToInstant = zonedDateTime.toInstant(TimeZone.currentSystemDefault())

说明:Instant 总是 UTC 时间,转换为 LocalDateTime 需要指定时区,反向转换时同理。


Instant 在实际场景中的应用

  • 事件日志记录

  • 任务管理中时间点比较

  • 用户界面更新时间显示


使用 Instant 时的注意事项

  • Instant 始终表示 UTC 时间,不含时区信息。

  • 显示本地时间需先转换成对应时区的日期时间类型,例如 LocalDateTime 或 ZonedDateTime。


TimeZone 类介绍

用于表示时区信息。

  • TimeZone.currentSystemDefault():获取系统默认时区

  • TimeZone.UTC:UTC 时区(ISO 8601 中的 “Z”)

val tz1 = TimeZone.currentSystemDefault()
val tz2 = TimeZone.UTC
println(tz2)  // 输出 Z

其他时区可以用 TimeZone.of() 方法传入时区字符串,如偏移量或区域名,可从tz数据库"Europe/Rome"中找到有效的时区名称:

val tz3 = TimeZone.of("Europe/Paris")  // 巴黎时区
val tz4 = TimeZone.of("UTC+2")          // UTC+2 时区

无效参数会抛出 IllegalTimeZoneException


DateTimePeriod 类

用来表示两个 Instant 之间的时间差,并且将这个差异拆分成日期和时间的组成部分。你可以通过 yearsmonthsdayshoursminutessecondsnanoseconds 等属性来访问这些时间差。
获取两个 Instant 之间差值:

val period: DateTimePeriod = instant1.periodUntil(instant2, TimeZone.UTC)
println(period) // 输出 ISO 8601 格式,如 P9M12DT4H

使用 periodUntil(other: Instant, timeZone: TimeZone) 成员函数,可以获得两个 Instant 之间的时间差。其中 other 是另一个 InstanttimeZone 是时区。


println(period)
// 输出:P9M12DT4Hprintln("Months: ${period.months} Days: ${period.days} Hours: ${period.hours}")
// 输出:Months: 9 Days: 12 Hours: 4
  • P9M12DT4H 表示一个 ISO 8601 时间段:9个月,12天,4小时。
  • period.months 返回 9,表示 9 个月。
  • period.days 返回 12,表示 12 天。
  • period.hours 返回 4,表示 4 小时。

DateTimePeriod 的另一个重要用处 — 作为时间偏移量加减 Instant

可以用 Instant.plus() 给一个 Instant 添加一个时间段,或者用 Instant.minus() 减去一个时间段。

val after = instant.plus(period, TimeZone.UTC)    // 加时间段
val before = instant.minus(period, TimeZone.UTC)  // 减时间段
  • period 表示 1 年 1 个月 1 天 1 小时 1 分钟 1 秒以及 123,456,789 纳秒的时间段。
  • instant.plus(period, TimeZone.UTC) 会返回加上该时间段之后的新时间。
  • instant.minus(period, TimeZone.UTC) 会返回减去该时间段之前的时间。

Duration 和 DateTimePeriod 的区别

  • Duration(kotlin.time)表示固定长度的时间量(天、小时、分钟等),通常用于时间差的绝对值。

  • DateTimePeriod(kotlinx)表示以年月日等日历单位划分的时间段,更适合人类理解和日期计算。

示例:

val instant1 = Instant.parse("2100-01-01T00:00:00Z")
val instant2 = Instant.parse("2105-07-09T15:23:40Z")val duration = instant2 - instant1
println(duration)                     // 2015d 15h 23m 40s
println(duration.inWholeDays)         // 2015val period = instant1.periodUntil(instant2, TimeZone.UTC)
println(period)                      // P5Y6M8DT15H23M40S
println(period.days)                 // 8
  • Duration 是表示精确的时间间隔(以秒和纳秒为单位),如总共多少天、多少小时。
  • DateTimePeriod 表示日历时间段,可以按年、月、日、小时、分钟、秒拆分。
  • 例如,Duration 的输出显示总计了 2015 天 15 小时 23 分钟 40 秒,而 DateTimePeriod 显示了 5 年 6 个月 8 天 15 小时 23 分钟 40 秒。

总结

本文介绍了 kotlinx-datetime 库中的 InstantTimeZoneDateTimePeriod 等核心类的使用方法,帮助你正确创建、转换和操作时间点及时间段。这个库还支持更多功能,比如日期和时间的本地化,方便跨平台日期时间处理。


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

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

相关文章

基于模型蒸馏的大模型文案生成最佳实践

背景 大语言模型在生成高质量文案方面表现优异&#xff0c;然而其巨大的计算资源消耗和存储需求&#xff0c;使得实际应用尤其是在资源受限场景中的应用充满挑战。企业在寻求高效的文案生成时&#xff0c;常常面临着在性能和资源之间权衡的困境。在这种背景下&#xff0c;模型…

调用通义千问大模型实现流式对话

前言 我使用的是硅基流动中通义千问免费的大模型&#xff1a;我的技术栈使用的 Next14.2 全栈框架。 代码结构 需要使用的库&#xff1a; npm i ai openai目录结构&#xff1a; 基础测试页面 test-openai/page.tsx&#xff1a; use client;import { useChat } from ai/react;ex…

如何搭建Linux环境下的flink本地集群

第一步&#xff0c;搭建Linux环境 这里我使用的是 WSL2 安装前&#xff0c;先用管理员打开终端&#xff0c;执行以下三条命令&#xff0c;目的是开启安装 WSL2所需要的环境 //开启适用于windows的Linux子系统 dism.exe /online /enable-feature /featurename:Microsoft-Wind…

算法:链表part02:24. 两两交换链表中的节点 + 19. 删除链表的倒数第 N 个结点 + 面试题 02.07. 链表相交

24. 两两交换链表中的节点题目&#xff1a;https://leetcode.cn/problems/swap-nodes-in-pairs/description/ 讲解&#xff1a;https://programmercarl.com/0024.%E4%B8%A4%E4%B8%A4%E4%BA%A4%E6%8D%A2%E9%93%BE%E8%A1%A8%E4%B8%AD%E7%9A%84%E8%8A%82%E7%82%B9.html 复习可以先…

【Linux学习】(11)进程的概念

前言在上一章我们知道了什么是进程&#xff0c;并简单了解了PCB。 本文我们将继续深入学习进程概念相关知识点&#xff1a; 学习进程状态&#xff0c;学会创建进程&#xff0c;掌握僵尸进程和孤儿进程&#xff0c;及其形成原因和危害了解进程调度&#xff0c;Linux进程优先级&a…

UniappDay04

1.登录模块-小程序快捷登录定义接口&#xff0c;封装 import { http } from /utils/httptype loginParams {code: stringencryptedData: stringiv: string } export const postLoginWxMinAPI (data: loginParams) > {return http({method: POST,url: /login/wxMin,data,})…

NPM/Yarn完全指南:前端开发的“基石“与“加速器“

开篇:当你第一次运行npm install时... "这node_modules文件夹怎么比我的项目代码还大100倍?!" —— 每个前端新手第一次看到node_modules时的反应都出奇地一致。别担心,今天我要带你彻底搞懂这个让项目"膨胀"的"罪魁祸首",以及如何用NPM/Y…

vue页面自定义滚动条

效果图实现思路 固定整个灰色滚动条的长度计算可滚动区域占整个可视视图的比例&#xff0c;来确定橙色块的长度监听页面滚动&#xff0c;计算橙色块向右偏移距离 主要代码 template&#xff1a; <div v-show"showBar" ref"barRef" class"scrollbar…

企业级JWT验证最佳方案:StringUtils.hasText()

在企业级Java开发中&#xff0c;判断JWT令牌是否有效的最全面且常用的方式是结合以下两种方法&#xff1a; ✅ 推荐方案&#xff1a;StringUtils.hasText(jwt)&#xff08;Spring框架&#xff09; import org.springframework.util.StringUtils;if (!StringUtils.hasText(jwt))…

灵动画布:快手可灵 AI 推出的多人协作 AI 创意工作台

灵动画布&#xff1a;快手可灵 AI 推出的多人协作 AI 创意工作台 来源&#xff1a;Poixe AI 一、什么是灵动画布 灵动画布是快手旗下可灵 AI 于 2025 世界人工智能大会期间发布的全新创意工作台功能。该功能集无限可视化画布空间、多人实时协作及 AI 智能辅助于一体&#xf…

【Linux篇】进程间通信:进程IPC

目录 共享内存空间 共享内存是在用户空间还是内核空间&#xff1f;——用户空间 共享内存的生命周期 如何使用共享内存 共享内存的权限 共享内存是进程间通信中&#xff0c;速度最快的方式&#xff1a; 共享内存的缺点&#xff1a; 进程间通信标准&#xff1a; system …

Kubernetes 存储入门

目录 Volume 的概念 Volume 的类型 通过 emptyDir 共享数据 编写 emptyDir 的 Deployment 文件 部署该 Deployment 查看部署结果 登录 Pod 中的第一个容器 登录 Pod 中的第二个容器查看 /mnt 下的文件 删除此 Pod 使用 HostPath 挂载宿主机文件 编写 Deployment 文件…

深入理解Redission释放锁过程

lock.unlock();调用unlock方法&#xff0c;往下追Override public void unlock() {try {// 1. 执行异步解锁操作并同步等待结果// - 获取当前线程ID作为锁持有者标识// - unlockAsync()触发Lua脚本执行实际解锁// - get()方法阻塞直到异步操作完成get(unlockAsync(Thread.curre…

四、计算机组成原理——第4章:指令系统

目录 4.1指令系统 4.1.1指令集体系结构 4.1.2指令的基本格式 1.零地址指令 2.一地址指令 3.二地址指令 4.三地址指令 5.四地址指令 4.1.3定长操作码指令格式 4.1.4扩展操作码指令格式 4.1.5指令的操作类型 1.数据传送 2.算术和逻辑运算 3.移位操作 4.转移操作 …

RAG面试内容整理-检索器与生成器的解耦架构

在RAG系统中,检索器(Retriever)与生成器(Generator)的解耦架构是实现灵活高效的关键设计。所谓解耦,即将检索相关文档和生成答案两个步骤分开,由不同的模块或模型负责。这种架构带来的直接好处是模块独立优化:我们可以针对检索任务微调或更换检索模型,而不必影响生成模…

【2026毕业论文鸿蒙系统毕设选题】最新颖的基于HarmonyOS鸿蒙毕业设计选题汇总易过的精品毕设项目分享(建议收藏)✅

文章目录前言最新毕设选题&#xff08;建议收藏起来&#xff09;最新颖的鸿蒙毕业设计选题汇总100套易过的精品毕设项目分享毕设作品推荐&#x1f447;&#x1f447;&#x1f447;文未可免费咨询毕设相关问题&#xff0c;点赞留言可送系统源码&#x1f447;&#x1f447;&#…

超全!Linux 面试 100 题精选解析:网络篇|16 个 Linux 网络排查与配置必考题详解

网络&#xff0c;是 Linux 系统的神经系统。 一台服务器再强大&#xff0c;没有网络连接也如孤岛。尤其在实际运维与面试场景中&#xff0c;“网络相关的问题”是高频重灾区&#xff0c;比如&#xff1a; IP 配置错乱&#xff0c;连不上公网DNS 无响应&#xff0c;域名解析失败…

在 CentOS 上安装 FFmpeg

在 CentOS 上安装 FFmpeg 可以通过以下两种推荐方法实现&#xff08;以 CentOS 7/8 为例&#xff09;&#xff1a; 方法一&#xff1a;通过 RPM Fusion 仓库安装&#xff08;推荐&#xff09; # 1. 安装 EPEL 仓库 sudo yum install epel-release# 2. 启用 RPM Fusion 仓库 # C…

数据结构——图(一、图的定义)

一、图的定义1、什么是图&#xff1f;图G(V,E) 如图&#xff0c;无向图G顶点集V{,,...,}&#xff0c;用|V|表示图G的顶点个数如&#xff1a;V{A,B,C,D} ,|V|4边集E{(u,v)|uV, vV}&#xff0c; 用|E|表示图G的边的条数如&#xff1a;E{(u,v)|(A,B),(A,D),(A,C),(C,D)}&#xf…

Python 列表推导式与生成器表达式

Python 列表推导式与生成器表达式在 Python 中&#xff0c;列表推导式&#xff08;List Comprehension&#xff09;和生成器表达式&#xff08;Generator Expression&#xff09;是处理序列数据的高效工具。它们不仅能简化代码&#xff0c;还能提升数据处理的效率。本文将详细介…