在 kotlin 中获取 EPOCH 时间戳的正确方法

Ven*_*cat 4 java epoch kotlin

我想以“秒”:“纳秒”格式获取 kotlin 中的 EPOCH 时间戳。

注意:请查看已接受的答案以获得正确的解决方案。

编辑:

这是我目前的解决方案,我确信会有更好的方法来实现这一目标,

import java.time.Instant
import java.time.temporal.ChronoUnit;
import kotlin.time.Duration.Companion.seconds

fun main() {
    val epochNanoseconds = ChronoUnit.NANOS.between(Instant.EPOCH, Instant.now())
    val epochSeconds = epochNanoseconds/1.seconds.inWholeNanoseconds
    val remainingFractionOfNanoSeconds = epochNanoseconds%1.seconds.inWholeNanoseconds
    println("$epochSeconds:$remainingFractionOfNanoSeconds")
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

1670251213:849754000
Run Code Online (Sandbox Code Playgroud)

另一个例子(来自评论): 对于 1670251213 秒 50000 纳秒,也称为十进制 1670251213.00005 秒,我想要1670251213:50000(意味着:)。

有没有什么方法可以直接从java.time.Instant或任何其他可用的库中获取秒数和剩余纳秒数来方便地实现此目的?

已接受答案的解决方案:

import java.time.Instant

fun main() {
    val time = Instant.now()
    println("${time.epochSecond}:${time.nano}")
}
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 6

太长了;博士

你工作太辛苦了。

询问Instant对象自 1970-01-01T00:00Z 以来的整秒数。制作一个字符串,附加冒号字符。然后将纳秒计数附加到 的小数秒中Instant

instant.getEpochSecond() 
+ ":" 
+ instant.getNano() 
Run Code Online (Sandbox Code Playgroud)

1670220134:130848

细节

旧版日期时间类(CalendarDate等)和现代java.time类都不支持您请求的国际原子时间 (TAI) 。传统计算机(以及 Java)上的计时远不如原子钟那么准确。

也许您宽松地使用了该术语,并且实际上只想要自 1970 年第一个时刻的纪元参考以来的纳秒计数,如在限制内与UTC小时-分钟-秒 (1970-01-01T00:00Z) 的偏移量所示传统计算机硬件。

如果是这样,该Instant课程将适合您。但要注意基于OpenJDK代码库的 Java 实现的限制。

  • 在 Java 8 中,第一个使用java.time类,以毫秒的分辨率捕获当前时刻。
  • 在 Java 9+ 中,当前时刻的捕获精度为微秒(通常,取决于计算机硬件的限制)。

请注意,在所有版本(8、9 及更高版本)中,anInstant都具有纳秒分辨率。上面列出的限制与从计算机硬件时钟捕获当前时刻有关。

类中时刻的内部表示Instant包括两部分:

  • 自 1970-01-01T00:00Z 以来的整秒计数。
  • 以纳秒计数表示的小数秒。

该类Instant提供了一对访问器方法(getter)来查看这两个数字。

您的问题并不完全清楚,您似乎是在要求这两个数字之间有一个冒号字符。

instant.getEpochSecond() 
+ ":" 
+ instant.getNano() 
Run Code Online (Sandbox Code Playgroud)

instant.toString(): 2022-12-05T06:12:33.294698Z

输出:1670220753:294698

如果您想在小数秒右侧填充零,请使用String.format

Instant instant = Instant.now() ;
String nanos = Long.toString( instant.getNano() ) ;
String output = 
    instant.getEpochSecond() 
    + ":" 
    + instant.getNano()
;
Run Code Online (Sandbox Code Playgroud)

请参阅在 Ideone.com 上运行的此代码。

instant.toString(): 2022-12-05T06:12:33.294698Z

输出:1670220753:294698000

或者,您可以实例化一个BigDecimal对象。

  • @Vencat 不,闰秒被忽略。这在日历的背景下是有意义的,因为闰秒的目的是减慢时钟以使日历(年月日)赶上。如果您确实需要闰秒(这很不寻常),请将 [*ThreeTen-Extra*](https://www. Threeten.org/ Threeten-extra/) 库添加到您的项目中以访问其 [`org. Threeten .extra.scale`](https://www. Threeten.org/ Threeten-extra/apidocs/org. Threeten.extra/org/ Threeten/extra/scale/package-summary.html)包。 (2认同)