如何将毫秒转换为“mm:ss:ms”格式?

时间:2021-05-18 10:30:02

标签: java kotlin time format

我正在开发一个程序,我在其中搜索两个文本文件并比较它们(这是 JetBrains Academy 的一项任务)。最后,我的任务是输出执行此操作所需的时间,格式为“mm:ss:ms”。图片作为参考:

1

这是我为实现这一目标而编写的代码。我想这很不正确,所以我为此道歉,我学习 Kotlin 和编程的时间不长。

val millis = System.currentTimeMillis()
val time = String.format("%1\$tM min. %1\$tS sec. %1\$tL ms.", millis);

println("Start searching...")
println("Found $number. Time taken: $time ")

我得到的输出是这样的:

> Start searching...
Found 864 / 864. Time taken: 19 min. 53 sec. 611 ms. 

分钟和秒是错误的,因为它用了不到一秒钟。我对 ms 表示怀疑,因为它们适合花费多少时间。有人可以帮助我解决我做错了什么吗?谢谢!

2 个答案:

答案 0 :(得分:2)

来自System.currentTimeMillis()

<块引用>

返回当前时间与 UTC 1970 年 1 月 1 日午夜之间的差值(以毫秒为单位)。

因此,您在输出中看到的是从 1970-01-01T00:00:00 到现在所用时间的 Hh:mm:ss 部分。

您真正想要的是花费的时间,即时间测量的开始和结束之间的差异。

val start = System.currentTimeMillis()

// do your processing

val end = System.currentTimeMillis()
val time = String.format("%1$tM min. %1$tS sec. %1$tL ms.", end - start)

这应该会给你一个合适的输出。


如评论中所述,某些时区会发生奇怪的事情。而 String.format() 似乎完全无法配置(至少我没有发现任何东西)。

如果您真的想安全起见,可以使用 answer 建议的 @SergeyAfinogenov,但要稍作调整:

val minutes = duration.getSeconds() / 60
val seconds = duration.getSeconds() - minutes * 60
val millis = duration.getNano() / 1_000_000
val time = String.format("%d min. %d sec. %d ms.%n", minutes, seconds, millis)

这可以有效地手动计算 Duration 的不同部分(分钟、秒、毫秒),然后相应地设置它们的格式。

答案 1 :(得分:0)

我更喜欢使用 Instant 和 ChronoUnit 类:

val now   = Instant.now()
//doing something
val later = Instant.now()

val time = String.format("%02d min. %02d sec. %03d ms.",
                          ChronoUnit.MINUTES.between(now,later),
                          ChronoUnit.SECONDS.between(now,later)%60,
                          ChronoUnit.MILLIS.between(now,later)%1000
                         )