diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotImpl.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotImpl.kt index e455dd646..ab4a1b724 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotImpl.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/BotImpl.kt @@ -24,6 +24,7 @@ import net.mamoe.mirai.network.closeAndJoin import net.mamoe.mirai.utils.* import net.mamoe.mirai.utils.internal.retryCatching import kotlin.coroutines.CoroutineContext +import kotlin.time.Duration import kotlin.time.ExperimentalTime import kotlin.time.measureTime @@ -138,7 +139,7 @@ abstract class BotImpl constructor( reconnect() } - logger.info { "Reconnected successfully in ${time.inMilliseconds} ms" } + logger.info { "Reconnected successfully in ${time.asHumanReadable}" } } is BotOfflineEvent.Active -> { val msg = if (event.cause == null) { diff --git a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt index c31e03724..b66bc6e1d 100644 --- a/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt +++ b/mirai-core/src/commonMain/kotlin/net.mamoe.mirai/utils/TimeUtils.kt @@ -15,6 +15,10 @@ package net.mamoe.mirai.utils import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmName import kotlin.jvm.JvmSynthetic +import kotlin.math.floor +import kotlin.time.Duration +import kotlin.time.DurationUnit +import kotlin.time.ExperimentalTime /** * 时间戳 @@ -76,4 +80,21 @@ inline val Int.weeksToSeconds: Long @get:JvmSynthetic inline val Int.monthsToSeconds: Long - get() = this * 30.daysToSeconds \ No newline at end of file + get() = this * 30.daysToSeconds + +@ExperimentalTime +val Duration.asHumanReadable: String + get() { + val builder = StringBuilder() + val days = toInt(DurationUnit.DAYS) + val hours = toInt(DurationUnit.HOURS) % 24 + val minutes = toInt(DurationUnit.MINUTES) % 60 + val s = floor(toDouble(DurationUnit.SECONDS) % 60 * 1000) / 1000 + with(builder) { + if (days != 0) append("${days}d ") + if (hours != 0) append("${hours}h ") + if (minutes != 0) append("${minutes}min ") + append("${s}s") + } + return builder.toString() + } diff --git a/mirai-core/src/commonTest/kotlin/net/mamoe/mirai/utils/TimeTest.kt b/mirai-core/src/commonTest/kotlin/net/mamoe/mirai/utils/TimeTest.kt new file mode 100644 index 000000000..ea40ae231 --- /dev/null +++ b/mirai-core/src/commonTest/kotlin/net/mamoe/mirai/utils/TimeTest.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2020 Mamoe Technologies and contributors. + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license that can be found through the following link. + * + * https://github.com/mamoe/mirai/blob/master/LICENSE + */ + +package net.mamoe.mirai.utils + +import kotlin.test.Test +import kotlin.test.assertTrue +import kotlin.time.DurationUnit +import kotlin.time.ExperimentalTime +import kotlin.time.toDuration + +internal class TimeTest { + @ExperimentalTime + @Test + fun testTimeHumanReadable() { + val time0 = 1.toDuration(DurationUnit.DAYS) + + 20.toDuration(DurationUnit.HOURS) + + 15.toDuration(DurationUnit.MINUTES) + + 2057.toDuration(DurationUnit.MILLISECONDS) + println(time0.asHumanReadable) + assertTrue { time0.asHumanReadable == "1d 20h 15min 2.057s" } + val time1 = 1.toDuration(DurationUnit.DAYS) + 59.toDuration(DurationUnit.MINUTES) + println(time1.asHumanReadable) + assertTrue { time1.asHumanReadable == "1d 59min 0.0s" } + } +} \ No newline at end of file