在Kotlin开发中,获取Epoch时间戳是日志打印、数据唯一标识生成、时间差计算等场景的常用操作,当需要更高精度的时间标识时,秒和纳秒组合的格式能满足需求。这种格式的时间戳由两部分组成:从1970年1月1日00:00:00 UTC到当前时间的秒数,以及当前秒内的纳秒偏移量。

使用Java 8时间API实现
Java 8引入的java.time包提供了完善的时间处理类,Kotlin可以直接调用这些API获取高精度时间戳,这是目前最推荐的规范实现方式。
获取秒:纳秒格式时间戳
通过Instant类可以获取当前的瞬时时间点,其中包含秒和纳秒的信息,具体实现代码如下:
import java.time.Instant
fun getEpochTimestampWithNano(): String {
val instant = Instant.now()
// 获取Epoch秒数
val epochSecond = instant.epochSecond
// 获取当前秒内的纳秒偏移量,范围0到999999999
val nanoOffset = instant.nano
return "$epochSecond:$nanoOffset"
}
fun main() {
val timestamp = getEpochTimestampWithNano()
println("当前Epoch时间戳(秒:纳秒): $timestamp")
}
这种方式的优势是API设计规范,兼容性较好,只要运行环境支持Java 8及以上版本就可以使用,返回的时间戳精度能达到纳秒级别。
拆分存储时间戳信息
如果不需要拼接成字符串,而是需要单独使用秒和纳秒两部分数据,可以直接获取对应字段存储到数据类中:
import java.time.Instant
data class EpochTimestamp(
val epochSecond: Long,
val nanoOffset: Int
)
fun getEpochTimestampParts(): EpochTimestamp {
val instant = Instant.now()
return EpochTimestamp(instant.epochSecond, instant.nano)
}
fun main() {
val timestampParts = getEpochTimestampParts()
println("秒数: ${timestampParts.epochSecond}, 纳秒偏移: ${timestampParts.nanoOffset}")
}
使用System类实现
如果运行环境不支持Java 8的java.time包,也可以使用传统的System类组合实现,不过这种方式需要注意纳秒精度的获取限制。
基础实现方式
System.currentTimeMillis()可以获取毫秒级时间戳,System.nanoTime()可以获取纳秒级的运行时间,但需要注意System.nanoTime()不是Epoch时间戳,需要结合处理才能得到正确的纳秒偏移:
fun getEpochTimestampWithNanoBySystem(): String {
// 获取毫秒级Epoch时间戳,转换为秒
val epochSecond = System.currentTimeMillis() / 1000
// 获取纳秒级运行时间,取模1秒得到纳秒偏移,注意nanoTime不是Epoch时间
val nanoOffset = (System.nanoTime() % 1000000000).toInt()
return "$epochSecond:$nanoOffset"
}
fun main() {
val timestamp = getEpochTimestampWithNanoBySystem()
println("当前Epoch时间戳(秒:纳秒): $timestamp")
}
这种方式的局限性比较明显,System.nanoTime()的精度和系统实现有关,部分环境下可能无法达到真正的纳秒精度,而且它的取值不是连续的Epoch时间,仅适合对精度要求不高的场景。
两种方式的对比
以下是两种实现方式的多维度对比,方便开发者根据场景选择:
| 实现方式 | 精度 | 兼容性 | 推荐程度 |
|---|---|---|---|
| Java 8 Instant API | 纳秒级 | Java 8及以上 | 高 |
| System类组合 | 依赖系统实现 | 所有Java环境 | 低 |
注意事项
- 纳秒偏移量的范围是0到999999999,如果拼接字符串时需要对齐位数,可以补前导零,比如将纳秒偏移格式化为9位数字。
- 如果需要处理时区相关的时间,不要直接使用
Instant,可以先转换为ZonedDateTime再获取对应的时间戳信息。 - 不要在分布式场景下直接使用
System.nanoTime()生成的时间标识,因为它的取值仅对当前JVM实例有效,不同实例之间不具备可比性。
规范获取时间戳的核心是保证时间的准确性和一致性,优先选择官方提供的时间API,避免使用过时或者精度不足的实现方式。
Kotlin时间戳epoch_timestamp纳秒秒修改时间:2026-06-18 06:00:30