diff --git a/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt b/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt index 58179420a1f..9d5f87e4e5d 100644 --- a/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt +++ b/libraries/stdlib/jvm/src/kotlin/time/DurationUnitJvm.kt @@ -8,26 +8,79 @@ package kotlin.time +import java.util.concurrent.TimeUnit + @SinceKotlin("1.6") @WasExperimental(ExperimentalTime::class) -public actual typealias DurationUnit = java.util.concurrent.TimeUnit +public actual enum class DurationUnit(internal val timeUnit: TimeUnit) { + /** + * Time unit representing one nanosecond, which is 1/1000 of a microsecond. + */ + NANOSECONDS(TimeUnit.NANOSECONDS), + /** + * Time unit representing one microsecond, which is 1/1000 of a millisecond. + */ + MICROSECONDS(TimeUnit.MICROSECONDS), + /** + * Time unit representing one millisecond, which is 1/1000 of a second. + */ + MILLISECONDS(TimeUnit.MILLISECONDS), + /** + * Time unit representing one second. + */ + SECONDS(TimeUnit.SECONDS), + /** + * Time unit representing one minute. + */ + MINUTES(TimeUnit.MINUTES), + /** + * Time unit representing one hour. + */ + HOURS(TimeUnit.HOURS), + /** + * Time unit representing one day, which is always equal to 24 hours. + */ + DAYS(TimeUnit.DAYS); +} + +/** + * Converts this [kotlin.time.DurationUnit][DurationUnit] enum value to the corresponding [java.util.concurrent.TimeUnit][java.util.concurrent.TimeUnit] value. + */ +@SinceKotlin("1.6") +@ExperimentalTime +public fun DurationUnit.toTimeUnit(): TimeUnit = timeUnit + +/** + * Converts this [java.util.concurrent.TimeUnit][java.util.concurrent.TimeUnit] enum value to the corresponding [kotlin.time.DurationUnit][DurationUnit] value. + */ +@SinceKotlin("1.6") +@ExperimentalTime +public fun TimeUnit.toDurationUnit(): DurationUnit = when (this) { + TimeUnit.NANOSECONDS -> DurationUnit.NANOSECONDS + TimeUnit.MICROSECONDS -> DurationUnit.MICROSECONDS + TimeUnit.MILLISECONDS -> DurationUnit.MILLISECONDS + TimeUnit.SECONDS -> DurationUnit.SECONDS + TimeUnit.MINUTES -> DurationUnit.MINUTES + TimeUnit.HOURS -> DurationUnit.HOURS + TimeUnit.DAYS -> DurationUnit.DAYS +} @SinceKotlin("1.3") internal actual fun convertDurationUnit(value: Double, sourceUnit: DurationUnit, targetUnit: DurationUnit): Double { - val sourceInTargets = targetUnit.convert(1, sourceUnit) + val sourceInTargets = targetUnit.timeUnit.convert(1, sourceUnit.timeUnit) if (sourceInTargets > 0) return value * sourceInTargets - val otherInThis = sourceUnit.convert(1, targetUnit) + val otherInThis = sourceUnit.timeUnit.convert(1, targetUnit.timeUnit) return value / otherInThis } @SinceKotlin("1.5") internal actual fun convertDurationUnitOverflow(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { - return targetUnit.convert(value, sourceUnit) + return targetUnit.timeUnit.convert(value, sourceUnit.timeUnit) } @SinceKotlin("1.5") internal actual fun convertDurationUnit(value: Long, sourceUnit: DurationUnit, targetUnit: DurationUnit): Long { - return targetUnit.convert(value, sourceUnit) + return targetUnit.timeUnit.convert(value, sourceUnit.timeUnit) } diff --git a/libraries/stdlib/jvm/test/time/DurationUnitJVMTest.kt b/libraries/stdlib/jvm/test/time/DurationUnitJVMTest.kt new file mode 100644 index 00000000000..7416b429ce9 --- /dev/null +++ b/libraries/stdlib/jvm/test/time/DurationUnitJVMTest.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package test.time + +import java.util.concurrent.TimeUnit +import kotlin.test.* +import kotlin.time.* + +@OptIn(ExperimentalTime::class) +class DurationUnitJVMTest { + @Test + fun conversionFromTimeUnit() { + for (unit in DurationUnit.values()) { + val timeUnit = unit.toTimeUnit() + assertEquals(unit.name, timeUnit.name) + assertEquals(unit, timeUnit.toDurationUnit()) + } + + for (timeUnit in TimeUnit.values()) { + val unit = timeUnit.toDurationUnit() + assertEquals(timeUnit.name, unit.name) + assertEquals(timeUnit, unit.toTimeUnit()) + } + } +} \ No newline at end of file diff --git a/libraries/stdlib/test/time/DurationTest.kt b/libraries/stdlib/test/time/DurationTest.kt index b815cea81c2..03ad5b16dc1 100644 --- a/libraries/stdlib/test/time/DurationTest.kt +++ b/libraries/stdlib/test/time/DurationTest.kt @@ -92,6 +92,7 @@ class DurationTest { repeat(10) { val d1 = value.toDuration(unit) val unit2 = units.random() + @OptIn(ExperimentalTime::class) val value2 = Duration.convert(value, unit, unit2) val d2 = value2.toDuration(unit2) assertEquals(d1, d2, "$value $unit in $unit2") @@ -200,6 +201,7 @@ class DurationTest { val unit = units.random() val unit2 = units.random() + @OptIn(ExperimentalTime::class) assertAlmostEquals(Duration.convert(value.toDouble(), unit, unit2), value.toDuration(unit).toDouble(unit2)) } diff --git a/libraries/stdlib/test/time/DurationUnitTest.kt b/libraries/stdlib/test/time/DurationUnitTest.kt index 30b6f440b23..71ee9abe2ae 100644 --- a/libraries/stdlib/test/time/DurationUnitTest.kt +++ b/libraries/stdlib/test/time/DurationUnitTest.kt @@ -19,6 +19,7 @@ import kotlin.time.DurationUnit.NANOSECONDS class DurationUnitTest { @Test + @OptIn(ExperimentalTime::class) fun conversion() { fun test(sourceValue: Double, sourceUnit: DurationUnit, targetValue: Double, targetUnit: DurationUnit) { assertEquals( diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 40e2096d973..fb13f3700eb 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -5645,15 +5645,15 @@ public final class kotlin/text/UStringsKt { } public abstract class kotlin/time/AbstractDoubleTimeSource : kotlin/time/TimeSource { - public fun (Ljava/util/concurrent/TimeUnit;)V - protected final fun getUnit ()Ljava/util/concurrent/TimeUnit; + public fun (Lkotlin/time/DurationUnit;)V + protected final fun getUnit ()Lkotlin/time/DurationUnit; public fun markNow ()Lkotlin/time/TimeMark; protected abstract fun read ()D } public abstract class kotlin/time/AbstractLongTimeSource : kotlin/time/TimeSource { - public fun (Ljava/util/concurrent/TimeUnit;)V - protected final fun getUnit ()Ljava/util/concurrent/TimeUnit; + public fun (Lkotlin/time/DurationUnit;)V + protected final fun getUnit ()Lkotlin/time/DurationUnit; public fun markNow ()Lkotlin/time/TimeMark; protected abstract fun read ()J } @@ -5699,22 +5699,22 @@ public final class kotlin/time/Duration : java/lang/Comparable { public static final fun toComponents-impl (JLkotlin/jvm/functions/Function3;)Ljava/lang/Object; public static final fun toComponents-impl (JLkotlin/jvm/functions/Function4;)Ljava/lang/Object; public static final fun toComponents-impl (JLkotlin/jvm/functions/Function5;)Ljava/lang/Object; - public static final fun toDouble-impl (JLjava/util/concurrent/TimeUnit;)D - public static final fun toInt-impl (JLjava/util/concurrent/TimeUnit;)I + public static final fun toDouble-impl (JLkotlin/time/DurationUnit;)D + public static final fun toInt-impl (JLkotlin/time/DurationUnit;)I public static final fun toIsoString-impl (J)Ljava/lang/String; - public static final fun toLong-impl (JLjava/util/concurrent/TimeUnit;)J + public static final fun toLong-impl (JLkotlin/time/DurationUnit;)J public static final fun toLongMilliseconds-impl (J)J public static final fun toLongNanoseconds-impl (J)J public fun toString ()Ljava/lang/String; public static fun toString-impl (J)Ljava/lang/String; - public static final fun toString-impl (JLjava/util/concurrent/TimeUnit;I)Ljava/lang/String; - public static synthetic fun toString-impl$default (JLjava/util/concurrent/TimeUnit;IILjava/lang/Object;)Ljava/lang/String; + public static final fun toString-impl (JLkotlin/time/DurationUnit;I)Ljava/lang/String; + public static synthetic fun toString-impl$default (JLkotlin/time/DurationUnit;IILjava/lang/Object;)Ljava/lang/String; public static final fun unaryMinus-UwyO8pc (J)J public final synthetic fun unbox-impl ()J } public final class kotlin/time/Duration$Companion { - public final fun convert (DLjava/util/concurrent/TimeUnit;Ljava/util/concurrent/TimeUnit;)D + public final fun convert (DLkotlin/time/DurationUnit;Lkotlin/time/DurationUnit;)D public final fun days-UwyO8pc (D)J public final fun days-UwyO8pc (I)J public final fun days-UwyO8pc (J)J @@ -5766,9 +5766,26 @@ public final class kotlin/time/DurationKt { public static final fun getSeconds (D)J public static final fun getSeconds (I)J public static final fun getSeconds (J)J - public static final fun toDuration (DLjava/util/concurrent/TimeUnit;)J - public static final fun toDuration (ILjava/util/concurrent/TimeUnit;)J - public static final fun toDuration (JLjava/util/concurrent/TimeUnit;)J + public static final fun toDuration (DLkotlin/time/DurationUnit;)J + public static final fun toDuration (ILkotlin/time/DurationUnit;)J + public static final fun toDuration (JLkotlin/time/DurationUnit;)J +} + +public final class kotlin/time/DurationUnit : java/lang/Enum { + public static final field DAYS Lkotlin/time/DurationUnit; + public static final field HOURS Lkotlin/time/DurationUnit; + public static final field MICROSECONDS Lkotlin/time/DurationUnit; + public static final field MILLISECONDS Lkotlin/time/DurationUnit; + public static final field MINUTES Lkotlin/time/DurationUnit; + public static final field NANOSECONDS Lkotlin/time/DurationUnit; + public static final field SECONDS Lkotlin/time/DurationUnit; + public static fun valueOf (Ljava/lang/String;)Lkotlin/time/DurationUnit; + public static fun values ()[Lkotlin/time/DurationUnit; +} + +public final class kotlin/time/DurationUnitKt { + public static final fun toDurationUnit (Ljava/util/concurrent/TimeUnit;)Lkotlin/time/DurationUnit; + public static final fun toTimeUnit (Lkotlin/time/DurationUnit;)Ljava/util/concurrent/TimeUnit; } public abstract interface annotation class kotlin/time/ExperimentalTime : java/lang/annotation/Annotation {