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
英文地址,請注明出處:http://en.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;還能提升數據處理的效率。本文將詳細介…