1. 简介

本文将讲解 **如何在 Kotlin 中将日期时间字符串转换为 Instant**。

我们会先了解 Instant 的概念,并与常用的 LocalDateTime 进行对比,帮助你理解它们之间的区别。随后,我们将通过多种方法实现将字符串格式的日期时间转换为 Instant 对象。

2. 什么是 Instant

Instant 表示自纪元时间(1970-01-01)起的偏移量,因此它表示的是时间线上的一个“绝对时刻”。

关键点

  • 无论从地球哪个位置创建,只要在同一时刻,两个 Instant 对象的值就是一致的。
  • 适合用于需要精确时间戳的场景,比如日志记录、事件排序、跨时区调度等。

📌 参考文章:Java Instant 转换为字符串

3. InstantLocalDateTime 的区别

特性 Instant LocalDateTime
时区信息 无,始终表示 UTC 时间 无,但通常基于本地时区使用
使用场景 全球统一时刻,如事件时间戳 本地化时间展示,如用户生日
时间精度 精确到纳秒 精确到纳秒
操作性 不支持直接操作年月日 支持加减年月日等操作

⚠️ 重要提醒:如果你的应用涉及多个时区,使用 LocalDateTime 很容易踩坑,因为它不包含时区信息。

4. 将日期时间字符串转换为 Instant 的几种方式

下面介绍 5 种常见的转换方法。

4.1. 将字符串解析为 LocalDateTime 并结合 ZoneId

var strDate = "2021-11-25"
var strTime = "15:20"
var strDateTime = strDate + "T" + strTime
val ldt = LocalDateTime.parse(strDateTime)
val instant: Instant = ldt.atZone(ZoneId.systemDefault()).toInstant()
assertEquals("2021-11-25T14:20:00Z", instant.toString())

4.2. 使用 LocalDateTime.of() 构造方法

var strDate = "2021-11-25"
var strTime = "15:20"
val ldt = LocalDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime))
val instant: Instant = ldt.atZone(ZoneId.systemDefault()).toInstant()
assertEquals("2021-11-25T14:20:00Z", instant.toString())

4.3. 使用 ZonedDateTime

var strDate = "2021-11-25"
var strTime = "15:20"
val zdt1 = ZonedDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime), ZoneId.systemDefault())
val zdt2 = ZonedDateTime.of(LocalDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime)), ZoneId.systemDefault())
val instant1: Instant = zdt1.toInstant()
val instant2: Instant = zdt2.toInstant()

assertEquals("2021-11-25T14:20:00Z", instant1.toString())
assertEquals("2021-11-25T14:20:00Z", instant2.toString())

4.4. 使用 DateTimeFormatter 解析 ZonedDateTime

val strDate = "2021-11-25"
val strTime = "15:20"
val dtf = DateTimeFormatter.ISO_LOCAL_DATE_TIME.withZone(ZoneId.systemDefault())
val zdt = ZonedDateTime.parse(strDate + "T" + strTime, dtf)
val instant = zdt.toInstant()
assertEquals("2021-11-25T14:20:00Z", instant.toString())

4.5. 直接调用 LocalDateTime.toInstant()

val strDate = "2021-11-25"
val strTime = "15:20"
val ldt = LocalDateTime.of(LocalDate.parse(strDate), LocalTime.parse(strTime))
val instant = ldt.toInstant(ZoneId.systemDefault().rules.getOffset(ldt))
assertEquals("2021-11-25T14:20:00Z", instant.toString())

5. 总结

本文介绍了 Kotlin 中 Instant 的基本概念,并通过对比 LocalDateTime 帮助你理解其适用场景。

我们还通过 5 种不同的方式演示了如何将字符串格式的日期时间转换为 Instant。这些方法在实际开发中都非常实用,尤其是处理跨时区的时间转换时,使用 Instant 是更安全可靠的选择。

📌 想要查看完整代码示例和测试用例,可以访问 GitHub 仓库:
👉 Kotlin 时间处理示例代码


原始标题:How to Convert a Date Time String to Instant in Kotlin