小蝈 發表於 2025-7-30 10:02:03

Kotlin的datetime库如何在项目中使用

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>如何在项目中使用该库</li><ul class="second_class_ul"><li>Gradle 项目中</li><li>Maven 项目中</li><li>在源文件中导入时间处理包:</li></ul><li>Instant(瞬时点)介绍</li><ul class="second_class_ul"><li>创建 Instant 对象</li><li>转换为毫秒时间戳</li><li>从毫秒时间戳创建 Instant</li><li>Instant 的加减操作</li><li>Instant 和其他日期时间类型的转换</li><li>Instant 在实际场景中的应用</li><li>使用 Instant 时的注意事项</li></ul><li>TimeZone 类介绍</li><ul class="second_class_ul"></ul><li>DateTimePeriod 类</li><ul class="second_class_ul"></ul><li>DateTimePeriod 的另一个重要用处 &mdash; 作为时间偏移量加减 Instant</li><ul class="second_class_ul"></ul><li>Duration 和 DateTimePeriod 的区别</li><ul class="second_class_ul"></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p><strong>kotlinx</strong> 是一组不是 Kotlin 标准库一部分,但非常实用的扩展项目集合。其中,<code>kotlinx-datetime</code> 是一个跨平台的 Kotlin 时间日期处理库。</p>
<p class="maodian"></p><h2>如何在项目中使用该库</h2>
<p class="maodian"></p><h3>Gradle 项目中</h3>
<p>在 <code>repositories</code> 块中添加 Maven Central 仓库:</p>
<div class="jb51code"><pre class="brush:java;">repositories {
    mavenCentral()
}</pre></div>
<p><strong>说明</strong>:告诉 Gradle 在 Maven Central 仓库中查找依赖。</p>
<p>然后在 <code>dependencies</code> 块中添加依赖(以版本 0.4.0 为例):</p>
<div class="jb51code"><pre class="brush:java;">dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0")
}</pre></div>
<p><strong>说明</strong>:将 kotlinx-datetime 库作为实现依赖加入项目。</p>
<p class="maodian"></p><h3>Maven 项目中</h3>
<p>添加如下依赖:</p>
<div class="jb51code"><pre class="brush:plain;">&lt;dependency&gt;
    &lt;groupId&gt;org.jetbrains.kotlinx&lt;/groupId&gt;
    &lt;artifactId&gt;kotlinx-datetime-jvm&lt;/artifactId&gt;
    &lt;version&gt;0.4.0&lt;/version&gt;
&lt;/dependency&gt;</pre></div>
<p><strong>说明</strong>:Maven 中的依赖声明,版本号同样为 0.4.0。</p>
<p class="maodian"></p><h3>在源文件中导入时间处理包:</h3>
<div class="jb51code"><pre class="brush:java;">import kotlinx.datetime.*
</pre></div>
<p><strong>说明</strong>:引入库中所有时间相关的类和函数。</p>
<p class="maodian"></p><h2>Instant(瞬时点)介绍</h2>
<p><code>Instant</code> 表示时间线上某个具体的时刻,常用于比较两个时间点或存储时间戳。</p>
<p class="maodian"></p><h3>创建 Instant 对象</h3>
<p>创建 Instant 的实例非常简单<br />你可以使用该<code>now()</code>方法获取当前日期和时间,如下所示:</p>
<div class="jb51code"><pre class="brush:java;">import kotlinx.datetime.Clock
fun main() {
    val currentInstant = Clock.System.now()
    println(currentInstant) // 例如输出:2023-07-24T13:39:16.310148200Z
}</pre></div>
<p><strong>说明</strong>:<code>Clock.System.now()</code> 获取当前 UTC 时间的 <code>Instant</code>。</p>
<p class="maodian"></p><h3>转换为毫秒时间戳</h3>
<p>如果你需要以毫秒为单位的时间,可以使用<code>.toEpochMilliseconds()</code></p>
<div class="jb51code"><pre class="brush:java;">val currentInstantInMillisec = currentInstant.toEpochMilliseconds()</pre></div>
<p><strong>说明</strong>:<code>toEpochMilliseconds()</code> 返回当前时间点自 Unix 纪元(1970-01-01T00:00:00Z)以来的毫秒数。</p>
<p class="maodian"></p><h3>从毫秒时间戳创建 Instant</h3>
<p>或者<code>fromEpochMilliseconds()</code>基于毫秒创建实例</p>
<div class="jb51code"><pre class="brush:java;">val specificInstant = Instant.fromEpochMilliseconds(currentInstantInMillisec)</pre></div>
<p><strong>说明</strong>:通过毫秒时间戳反向创建 <code>Instant</code> 对象。</p>
<p class="maodian"></p><h3>Instant 的加减操作</h3>
<p>可以使用 <code>plus()</code> 和 <code>minus()</code> 给 <code>Instant</code> 加上或减去一定的时间段(<code>Duration</code>):</p>
<div class="jb51code"><pre class="brush:java;">import kotlin.time.Duration
val futureInstant = currentInstant.plus(Duration.parse("6h"))   // 当前时间加6小时
val pastInstant = currentInstant.minus(Duration.parse("24h"))   // 当前时间减24小时</pre></div>
<p class="maodian"></p><h3>Instant 和其他日期时间类型的转换</h3>
<p>即时可以轻松转换为其他日期和时间类型,反之亦然</p>
<div class="jb51code"><pre class="brush:java;">val zonedDateTime = currentInstant.toLocalDateTime(TimeZone.currentSystemDefault())
val backToInstant = zonedDateTime.toInstant(TimeZone.currentSystemDefault())</pre></div>
<p><strong>说明</strong>:Instant 总是 UTC 时间,转换为 <code>LocalDateTime</code> 需要指定时区,反向转换时同理。</p>
<p class="maodian"></p><h3>Instant 在实际场景中的应用</h3>
<ul><li>事件日志记录</li><li>任务管理中时间点比较</li><li>用户界面更新时间显示</li></ul>
<p class="maodian"></p><h3>使用 Instant 时的注意事项</h3>
<ul><li><code>Instant</code> 始终表示 UTC 时间,不含时区信息。</li><li>显示本地时间需先转换成对应时区的日期时间类型,例如 LocalDateTime 或 ZonedDateTime。</li></ul>
<p class="maodian"></p><h2>TimeZone 类介绍</h2>
<p>用于表示时区信息。</p>
<ul><li><code>TimeZone.currentSystemDefault()</code>:获取系统默认时区</li><li><code>TimeZone.UTC</code>:UTC 时区(ISO 8601 中的 &ldquo;Z&rdquo;)</li></ul>
<div class="jb51code"><pre class="brush:java;">val tz1 = TimeZone.currentSystemDefault()
val tz2 = TimeZone.UTC
println(tz2)// 输出 Z</pre></div>
<p>其他时区可以用 <code>TimeZone.of()</code> 方法传入时区字符串,如偏移量或区域名,可从tz数据库&quot;Europe/Rome&quot;中找到有效的时区名称:</p>
<div class="jb51code"><pre class="brush:java;">val tz3 = TimeZone.of("Europe/Paris")// 巴黎时区
val tz4 = TimeZone.of("UTC+2")          // UTC+2 时区</pre></div>
<p>无效参数会抛出 <code>IllegalTimeZoneException</code>。</p>
<p class="maodian"></p><h2>DateTimePeriod 类</h2>
<p>用来表示两个 <code>Instant</code> 之间的时间差,并且将这个差异拆分成日期和时间的组成部分。你可以通过 <code>years</code>、<code>months</code>、<code>days</code>、<code>hours</code>、<code>minutes</code>、<code>seconds</code> 和 <code>nanoseconds</code> 等属性来访问这些时间差。<br />获取两个 <code>Instant</code> 之间差值:</p>
<div class="jb51code"><pre class="brush:java;">val period: DateTimePeriod = instant1.periodUntil(instant2, TimeZone.UTC)
println(period) // 输出 ISO 8601 格式,如 P9M12DT4H</pre></div>
<p>使用 <code>periodUntil(other: Instant, timeZone: TimeZone)</code> 成员函数,可以获得两个 <code>Instant</code> 之间的时间差。其中 <code>other</code> 是另一个 <code>Instant</code>,<code>timeZone</code> 是时区。</p>
<div class="jb51code"><pre class="brush:java;">println(period)
// 输出:P9M12DT4H
println("Months: ${period.months} Days: ${period.days} Hours: ${period.hours}")
// 输出:Months: 9 Days: 12 Hours: 4</pre></div>
<ul><li><code>P9M12DT4H</code> 表示一个 ISO 8601 时间段:9个月,12天,4小时。</li><li><code>period.months</code> 返回 9,表示 9 个月。</li><li><code>period.days</code> 返回 12,表示 12 天。</li><li><code>period.hours</code> 返回 4,表示 4 小时。</li></ul>
<p class="maodian"></p><h2>DateTimePeriod 的另一个重要用处 &mdash; 作为时间偏移量加减 Instant</h2>
<p>可以用 <code>Instant.plus()</code> 给一个 <code>Instant</code> 添加一个时间段,或者用 <code>Instant.minus()</code> 减去一个时间段。</p>
<div class="jb51code"><pre class="brush:java;">val after = instant.plus(period, TimeZone.UTC)    // 加时间段
val before = instant.minus(period, TimeZone.UTC)// 减时间段</pre></div>
<ul><li><code>period</code> 表示 1 年 1 个月 1 天 1 小时 1 分钟 1 秒以及 123,456,789 纳秒的时间段。</li><li><code>instant.plus(period, TimeZone.UTC)</code> 会返回加上该时间段之后的新时间。</li><li><code>instant.minus(period, TimeZone.UTC)</code> 会返回减去该时间段之前的时间。</li></ul>
<p class="maodian"></p><h2>Duration 和 DateTimePeriod 的区别</h2>
<ul><li><code>Duration</code>(kotlin.time)表示固定长度的时间量(天、小时、分钟等),通常用于时间差的绝对值。</li><li><code>DateTimePeriod</code>(kotlinx)表示以年月日等日历单位划分的时间段,更适合人类理解和日期计算。</li></ul>
<p>示例:</p>
<div class="jb51code"><pre class="brush:java;">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)         // 2015
val period = instant1.periodUntil(instant2, TimeZone.UTC)
println(period)                      // P5Y6M8DT15H23M40S
println(period.days)               // 8</pre></div>
<ul><li><code>Duration</code> 是表示精确的时间间隔(以秒和纳秒为单位),如总共多少天、多少小时。</li><li><code>DateTimePeriod</code> 表示日历时间段,可以按年、月、日、小时、分钟、秒拆分。</li><li>例如,<code>Duration</code> 的输出显示总计了 2015 天 15 小时 23 分钟 40 秒,而 <code>DateTimePeriod</code> 显示了 5 年 6 个月 8 天 15 小时 23 分钟 40 秒。</li></ul>
<p class="maodian"></p><h2>总结</h2>
<p>本文介绍了 <code>kotlinx-datetime</code> 库中的 <code>Instant</code>、<code>TimeZone</code>、<code>DateTimePeriod</code> 等核心类的使用方法,帮助你正确创建、转换和操作时间点及时间段。这个库还支持更多功能,比如日期和时间的本地化,方便跨平台日期时间处理。</p>
<p>到此这篇关于Kotlin的datetime库如何在项目中使用的文章就介绍到这了,更多相关Kotlin datetime库 内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>Kotlin标准库函数使用分析及介绍</li><li>Android 官推 kotlin-first 的图片加载库——Coil的使用入门</li><li>Kotlin + Flow 实现Android 应用初始化任务启动库</li><li>Android kotlin+协程+Room数据库的简单使用</li><li>kotlin项目加入Glide图片加载库并使用GlideApp的方法</li><li>Spring Boot 与 Kotlin 使用Redis数据库的配置方法</li><li>Spring Boot 与 Kotlin 使用JdbcTemplate连接MySQL数据库的方法</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: Kotlin的datetime库如何在项目中使用