我正在开发一个程序,我在其中搜索两个文本文件并比较它们(这是 JetBrains Academy 的一项任务)。最后,我的任务是输出执行此操作所需的时间,格式为“mm:ss:ms”。图片作为参考:
这是我为实现这一目标而编写的代码。我想这很不正确,所以我为此道歉,我学习 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 表示怀疑,因为它们适合花费多少时间。有人可以帮助我解决我做错了什么吗?谢谢!
答案 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
)