diff --git a/build.gradle.kts b/build.gradle.kts index 6f2aea9aa..5db167372 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -50,8 +50,8 @@ kover { reports { verify { rule { - // requirement for a minimum lines coverage of 85% - minBound(85) + // requirement for a minimum lines coverage of 80% + minBound(80) } } } diff --git a/core/api/kotlinx-datetime.api b/core/api/kotlinx-datetime.api index 41d201968..e7873835c 100644 --- a/core/api/kotlinx-datetime.api +++ b/core/api/kotlinx-datetime.api @@ -19,20 +19,24 @@ public final class kotlinx/datetime/ClockKt { } public final class kotlinx/datetime/ConvertersKt { + public static final fun toJavaDayOfWeek (Lkotlinx/datetime/DayOfWeek;)Ljava/time/DayOfWeek; public static final fun toJavaInstant (Lkotlinx/datetime/Instant;)Ljava/time/Instant; public static final fun toJavaLocalDate (Lkotlinx/datetime/LocalDate;)Ljava/time/LocalDate; public static final fun toJavaLocalDateTime (Lkotlinx/datetime/LocalDateTime;)Ljava/time/LocalDateTime; public static final fun toJavaLocalTime (Lkotlinx/datetime/LocalTime;)Ljava/time/LocalTime; + public static final fun toJavaMonth (Lkotlinx/datetime/Month;)Ljava/time/Month; public static final fun toJavaPeriod (Lkotlinx/datetime/DatePeriod;)Ljava/time/Period; public static final fun toJavaZoneId (Lkotlinx/datetime/TimeZone;)Ljava/time/ZoneId; public static final fun toJavaZoneOffset (Lkotlinx/datetime/FixedOffsetTimeZone;)Ljava/time/ZoneOffset; public static final fun toJavaZoneOffset (Lkotlinx/datetime/UtcOffset;)Ljava/time/ZoneOffset; public static final fun toKotlinDatePeriod (Ljava/time/Period;)Lkotlinx/datetime/DatePeriod; + public static final fun toKotlinDayOfWeek (Ljava/time/DayOfWeek;)Lkotlinx/datetime/DayOfWeek; public static final fun toKotlinFixedOffsetTimeZone (Ljava/time/ZoneOffset;)Lkotlinx/datetime/FixedOffsetTimeZone; public static final fun toKotlinInstant (Ljava/time/Instant;)Lkotlinx/datetime/Instant; public static final fun toKotlinLocalDate (Ljava/time/LocalDate;)Lkotlinx/datetime/LocalDate; public static final fun toKotlinLocalDateTime (Ljava/time/LocalDateTime;)Lkotlinx/datetime/LocalDateTime; public static final fun toKotlinLocalTime (Ljava/time/LocalTime;)Lkotlinx/datetime/LocalTime; + public static final fun toKotlinMonth (Ljava/time/Month;)Lkotlinx/datetime/Month; public static final fun toKotlinTimeZone (Ljava/time/ZoneId;)Lkotlinx/datetime/TimeZone; public static final fun toKotlinUtcOffset (Ljava/time/ZoneOffset;)Lkotlinx/datetime/UtcOffset; public static final fun toKotlinZoneOffset (Ljava/time/ZoneOffset;)Lkotlinx/datetime/FixedOffsetTimeZone; @@ -167,9 +171,24 @@ public final class kotlinx/datetime/DateTimeUnit$TimeBased$Companion { public final fun serializer ()Lkotlinx/serialization/KSerializer; } +public final class kotlinx/datetime/DayOfWeek : java/lang/Enum { + public static final field FRIDAY Lkotlinx/datetime/DayOfWeek; + public static final field MONDAY Lkotlinx/datetime/DayOfWeek; + public static final field SATURDAY Lkotlinx/datetime/DayOfWeek; + public static final field SUNDAY Lkotlinx/datetime/DayOfWeek; + public static final field THURSDAY Lkotlinx/datetime/DayOfWeek; + public static final field TUESDAY Lkotlinx/datetime/DayOfWeek; + public static final field WEDNESDAY Lkotlinx/datetime/DayOfWeek; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lkotlinx/datetime/DayOfWeek; + public static fun values ()[Lkotlinx/datetime/DayOfWeek; +} + public final class kotlinx/datetime/DayOfWeekKt { - public static final fun DayOfWeek (I)Ljava/time/DayOfWeek; + public static final synthetic fun DayOfWeek (I)Ljava/time/DayOfWeek; + public static final fun DayOfWeek (I)Lkotlinx/datetime/DayOfWeek; public static final fun getIsoDayNumber (Ljava/time/DayOfWeek;)I + public static final fun getIsoDayNumber (Lkotlinx/datetime/DayOfWeek;)I } public final class kotlinx/datetime/FixedOffsetTimeZone : kotlinx/datetime/TimeZone { @@ -257,14 +276,17 @@ public final class kotlinx/datetime/LocalDate : java/lang/Comparable { public static final field Companion Lkotlinx/datetime/LocalDate$Companion; public fun (III)V public fun (ILjava/time/Month;I)V + public fun (ILkotlinx/datetime/Month;I)V public synthetic fun compareTo (Ljava/lang/Object;)I public fun compareTo (Lkotlinx/datetime/LocalDate;)I public fun equals (Ljava/lang/Object;)Z public final fun getDay ()I public final fun getDayOfMonth ()I public final fun getDayOfWeek ()Ljava/time/DayOfWeek; + public final fun getDayOfWeek ()Lkotlinx/datetime/DayOfWeek; public final fun getDayOfYear ()I public final fun getMonth ()Ljava/time/Month; + public final fun getMonth ()Lkotlinx/datetime/Month; public final fun getMonthNumber ()I public final fun getYear ()I public fun hashCode ()I @@ -290,6 +312,7 @@ public final class kotlinx/datetime/LocalDate$Formats { } public final class kotlinx/datetime/LocalDateJvmKt { + public static final fun LocalDate (ILjava/time/Month;I)Lkotlinx/datetime/LocalDate; public static final fun daysUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)I public static final fun minus (Lkotlinx/datetime/LocalDate;ILkotlinx/datetime/DateTimeUnit$DateBased;)Lkotlinx/datetime/LocalDate; public static final fun monthsUntil (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalDate;)I @@ -305,7 +328,7 @@ public final class kotlinx/datetime/LocalDateJvmKt { public final class kotlinx/datetime/LocalDateKt { public static final fun LocalDate (III)Lkotlinx/datetime/LocalDate; - public static final fun LocalDate (ILjava/time/Month;I)Lkotlinx/datetime/LocalDate; + public static final fun LocalDate (ILkotlinx/datetime/Month;I)Lkotlinx/datetime/LocalDate; public static final fun atTime (Lkotlinx/datetime/LocalDate;IIII)Lkotlinx/datetime/LocalDateTime; public static final fun atTime (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalTime;)Lkotlinx/datetime/LocalDateTime; public static synthetic fun atTime$default (Lkotlinx/datetime/LocalDate;IIIIILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; @@ -325,6 +348,8 @@ public final class kotlinx/datetime/LocalDateTime : java/lang/Comparable { public synthetic fun (IIIIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (ILjava/time/Month;IIIII)V public synthetic fun (ILjava/time/Month;IIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILkotlinx/datetime/Month;IIIII)V + public synthetic fun (ILkotlinx/datetime/Month;IIIIIILkotlin/jvm/internal/DefaultConstructorMarker;)V public fun (Lkotlinx/datetime/LocalDate;Lkotlinx/datetime/LocalTime;)V public synthetic fun compareTo (Ljava/lang/Object;)I public fun compareTo (Lkotlinx/datetime/LocalDateTime;)I @@ -333,10 +358,12 @@ public final class kotlinx/datetime/LocalDateTime : java/lang/Comparable { public final fun getDay ()I public final fun getDayOfMonth ()I public final fun getDayOfWeek ()Ljava/time/DayOfWeek; + public final fun getDayOfWeek ()Lkotlinx/datetime/DayOfWeek; public final fun getDayOfYear ()I public final fun getHour ()I public final fun getMinute ()I public final fun getMonth ()Ljava/time/Month; + public final fun getMonth ()Lkotlinx/datetime/Month; public final fun getMonthNumber ()I public final fun getNanosecond ()I public final fun getSecond ()I @@ -362,8 +389,10 @@ public final class kotlinx/datetime/LocalDateTime$Formats { public final class kotlinx/datetime/LocalDateTimeKt { public static final fun LocalDateTime (IIIIIII)Lkotlinx/datetime/LocalDateTime; public static final fun LocalDateTime (ILjava/time/Month;IIIII)Lkotlinx/datetime/LocalDateTime; + public static final fun LocalDateTime (ILkotlinx/datetime/Month;IIIII)Lkotlinx/datetime/LocalDateTime; public static synthetic fun LocalDateTime$default (IIIIIIIILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; public static synthetic fun LocalDateTime$default (ILjava/time/Month;IIIIIILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; + public static synthetic fun LocalDateTime$default (ILkotlinx/datetime/Month;IIIIIILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; public static final fun format (Lkotlinx/datetime/LocalDateTime;Lkotlinx/datetime/format/DateTimeFormat;)Ljava/lang/String; public static final fun toLocalDateTime (Ljava/lang/String;)Lkotlinx/datetime/LocalDateTime; } @@ -407,18 +436,42 @@ public final class kotlinx/datetime/LocalTimeKt { public static final fun atDate (Lkotlinx/datetime/LocalTime;IIILkotlin/Unit;)Lkotlinx/datetime/LocalDateTime; public static final fun atDate (Lkotlinx/datetime/LocalTime;ILjava/time/Month;I)Lkotlinx/datetime/LocalDateTime; public static final fun atDate (Lkotlinx/datetime/LocalTime;ILjava/time/Month;ILkotlin/Unit;)Lkotlinx/datetime/LocalDateTime; + public static final fun atDate (Lkotlinx/datetime/LocalTime;ILkotlinx/datetime/Month;I)Lkotlinx/datetime/LocalDateTime; + public static final fun atDate (Lkotlinx/datetime/LocalTime;ILkotlinx/datetime/Month;ILkotlin/Unit;)Lkotlinx/datetime/LocalDateTime; public static final fun atDate (Lkotlinx/datetime/LocalTime;Lkotlinx/datetime/LocalDate;)Lkotlinx/datetime/LocalDateTime; public static synthetic fun atDate$default (Lkotlinx/datetime/LocalTime;IIIILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; public static synthetic fun atDate$default (Lkotlinx/datetime/LocalTime;IIILkotlin/Unit;ILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; public static synthetic fun atDate$default (Lkotlinx/datetime/LocalTime;ILjava/time/Month;IILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; public static synthetic fun atDate$default (Lkotlinx/datetime/LocalTime;ILjava/time/Month;ILkotlin/Unit;ILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; + public static synthetic fun atDate$default (Lkotlinx/datetime/LocalTime;ILkotlinx/datetime/Month;IILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; + public static synthetic fun atDate$default (Lkotlinx/datetime/LocalTime;ILkotlinx/datetime/Month;ILkotlin/Unit;ILjava/lang/Object;)Lkotlinx/datetime/LocalDateTime; public static final fun format (Lkotlinx/datetime/LocalTime;Lkotlinx/datetime/format/DateTimeFormat;)Ljava/lang/String; public static final fun toLocalTime (Ljava/lang/String;)Lkotlinx/datetime/LocalTime; } +public final class kotlinx/datetime/Month : java/lang/Enum { + public static final field APRIL Lkotlinx/datetime/Month; + public static final field AUGUST Lkotlinx/datetime/Month; + public static final field DECEMBER Lkotlinx/datetime/Month; + public static final field FEBRUARY Lkotlinx/datetime/Month; + public static final field JANUARY Lkotlinx/datetime/Month; + public static final field JULY Lkotlinx/datetime/Month; + public static final field JUNE Lkotlinx/datetime/Month; + public static final field MARCH Lkotlinx/datetime/Month; + public static final field MAY Lkotlinx/datetime/Month; + public static final field NOVEMBER Lkotlinx/datetime/Month; + public static final field OCTOBER Lkotlinx/datetime/Month; + public static final field SEPTEMBER Lkotlinx/datetime/Month; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lkotlinx/datetime/Month; + public static fun values ()[Lkotlinx/datetime/Month; +} + public final class kotlinx/datetime/MonthKt { - public static final fun Month (I)Ljava/time/Month; + public static final synthetic fun Month (I)Ljava/time/Month; + public static final fun Month (I)Lkotlinx/datetime/Month; public static final fun getNumber (Ljava/time/Month;)I + public static final fun getNumber (Lkotlinx/datetime/Month;)I } public class kotlinx/datetime/TimeZone { @@ -498,12 +551,12 @@ public final class kotlinx/datetime/format/DateTimeComponents { public final fun getAmPm ()Lkotlinx/datetime/format/AmPmMarker; public final fun getDay ()Ljava/lang/Integer; public final fun getDayOfMonth ()Ljava/lang/Integer; - public final fun getDayOfWeek ()Ljava/time/DayOfWeek; + public final fun getDayOfWeek ()Lkotlinx/datetime/DayOfWeek; public final fun getDayOfYear ()Ljava/lang/Integer; public final fun getHour ()Ljava/lang/Integer; public final fun getHourOfAmPm ()Ljava/lang/Integer; public final fun getMinute ()Ljava/lang/Integer; - public final fun getMonth ()Ljava/time/Month; + public final fun getMonth ()Lkotlinx/datetime/Month; public final fun getMonthNumber ()Ljava/lang/Integer; public final fun getNanosecond ()Ljava/lang/Integer; public final fun getOffsetHours ()Ljava/lang/Integer; @@ -520,12 +573,12 @@ public final class kotlinx/datetime/format/DateTimeComponents { public final fun setDateTimeOffset (Lkotlinx/datetime/LocalDateTime;Lkotlinx/datetime/UtcOffset;)V public final fun setDay (Ljava/lang/Integer;)V public final fun setDayOfMonth (Ljava/lang/Integer;)V - public final fun setDayOfWeek (Ljava/time/DayOfWeek;)V + public final fun setDayOfWeek (Lkotlinx/datetime/DayOfWeek;)V public final fun setDayOfYear (Ljava/lang/Integer;)V public final fun setHour (Ljava/lang/Integer;)V public final fun setHourOfAmPm (Ljava/lang/Integer;)V public final fun setMinute (Ljava/lang/Integer;)V - public final fun setMonth (Ljava/time/Month;)V + public final fun setMonth (Lkotlinx/datetime/Month;)V public final fun setMonthNumber (Ljava/lang/Integer;)V public final fun setNanosecond (Ljava/lang/Integer;)V public final fun setOffset (Lkotlinx/datetime/UtcOffset;)V @@ -767,10 +820,10 @@ public final class kotlinx/datetime/serializers/DayBasedDateTimeUnitSerializer : public final class kotlinx/datetime/serializers/DayOfWeekSerializer : kotlinx/serialization/KSerializer { public static final field INSTANCE Lkotlinx/datetime/serializers/DayOfWeekSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/time/DayOfWeek; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lkotlinx/datetime/DayOfWeek; public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/time/DayOfWeek;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lkotlinx/datetime/DayOfWeek;)V } public final class kotlinx/datetime/serializers/FixedOffsetTimeZoneSerializer : kotlinx/serialization/KSerializer { @@ -866,10 +919,10 @@ public final class kotlinx/datetime/serializers/MonthBasedDateTimeUnitSerializer public final class kotlinx/datetime/serializers/MonthSerializer : kotlinx/serialization/KSerializer { public static final field INSTANCE Lkotlinx/datetime/serializers/MonthSerializer; public synthetic fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/lang/Object; - public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Ljava/time/Month; + public fun deserialize (Lkotlinx/serialization/encoding/Decoder;)Lkotlinx/datetime/Month; public fun getDescriptor ()Lkotlinx/serialization/descriptors/SerialDescriptor; public synthetic fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/lang/Object;)V - public fun serialize (Lkotlinx/serialization/encoding/Encoder;Ljava/time/Month;)V + public fun serialize (Lkotlinx/serialization/encoding/Encoder;Lkotlinx/datetime/Month;)V } public final class kotlinx/datetime/serializers/TimeBasedDateTimeUnitSerializer : kotlinx/serialization/KSerializer { diff --git a/core/common/src/DayOfWeek.kt b/core/common/src/DayOfWeek.kt index ac4388b04..160850ecd 100644 --- a/core/common/src/DayOfWeek.kt +++ b/core/common/src/DayOfWeek.kt @@ -3,8 +3,13 @@ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ +@file:JvmName("DayOfWeekKt") +@file:JvmMultifileClass package kotlinx.datetime +import kotlin.jvm.JvmMultifileClass +import kotlin.jvm.JvmName + /** * The enumeration class representing the days of the week. * @@ -13,7 +18,7 @@ package kotlinx.datetime * * @sample kotlinx.datetime.test.samples.DayOfWeekSamples.usage */ -public expect enum class DayOfWeek { +public enum class DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, diff --git a/core/common/src/LocalDateTime.kt b/core/common/src/LocalDateTime.kt index 84a08c75a..8e5085ca4 100644 --- a/core/common/src/LocalDateTime.kt +++ b/core/common/src/LocalDateTime.kt @@ -3,6 +3,8 @@ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ +@file:JvmName("LocalDateTimeKt") +@file:JvmMultifileClass package kotlinx.datetime import kotlinx.datetime.format.* @@ -10,6 +12,8 @@ import kotlinx.datetime.serializers.LocalDateTimeIso8601Serializer import kotlinx.datetime.serializers.LocalDateTimeComponentSerializer import kotlinx.serialization.Serializable import kotlin.internal.* +import kotlin.jvm.JvmMultifileClass +import kotlin.jvm.JvmName /** * The representation of a specific civil date and time without a reference to a particular time zone. diff --git a/core/common/src/LocalTime.kt b/core/common/src/LocalTime.kt index 0c5dd8b3a..4c2154e77 100644 --- a/core/common/src/LocalTime.kt +++ b/core/common/src/LocalTime.kt @@ -2,15 +2,18 @@ * Copyright 2019-2022 JetBrains s.r.o. and contributors. * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ +@file:JvmName("LocalTimeKt") +@file:JvmMultifileClass package kotlinx.datetime -import kotlinx.datetime.LocalDate.Companion.parse import kotlinx.datetime.format.* import kotlinx.datetime.serializers.LocalTimeIso8601Serializer import kotlinx.datetime.serializers.LocalTimeComponentSerializer import kotlinx.serialization.Serializable import kotlin.internal.* +import kotlin.jvm.JvmMultifileClass +import kotlin.jvm.JvmName /** diff --git a/core/common/src/Month.kt b/core/common/src/Month.kt index ae3b8177a..9163d668d 100644 --- a/core/common/src/Month.kt +++ b/core/common/src/Month.kt @@ -3,8 +3,14 @@ * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ +@file:JvmName("MonthKt") +@file:JvmMultifileClass + package kotlinx.datetime +import kotlin.jvm.JvmMultifileClass +import kotlin.jvm.JvmName + /** * The enumeration class representing the 12 months of the year. * @@ -14,7 +20,7 @@ package kotlinx.datetime * * @sample kotlinx.datetime.test.samples.MonthSamples.usage */ -public expect enum class Month { +public enum class Month { /** January, month #01, with 31 days. */ JANUARY, @@ -69,6 +75,3 @@ public fun Month(number: Int): Month { require(number in 1..12) return Month.entries[number - 1] } - - -// companion object members vs type aliasing to java.time.Month? diff --git a/core/common/test/DayOfWeekTest.kt b/core/common/test/DayOfWeekTest.kt index cbdb252aa..5ed0a0b03 100644 --- a/core/common/test/DayOfWeekTest.kt +++ b/core/common/test/DayOfWeekTest.kt @@ -19,4 +19,19 @@ class DayOfWeekTest { assertFailsWith { DayOfWeek(8) } assertFailsWith { DayOfWeek(Int.MIN_VALUE) } } -} \ No newline at end of file + + @Test + fun testExhaustiveWhenDayOfWeek() { + for (dayOfWeek in DayOfWeek.entries) { + when (dayOfWeek) { + DayOfWeek.MONDAY -> assertEquals(1, dayOfWeek.isoDayNumber) + DayOfWeek.TUESDAY -> assertEquals(2, dayOfWeek.isoDayNumber) + DayOfWeek.WEDNESDAY -> assertEquals(3, dayOfWeek.isoDayNumber) + DayOfWeek.THURSDAY -> assertEquals(4, dayOfWeek.isoDayNumber) + DayOfWeek.FRIDAY -> assertEquals(5, dayOfWeek.isoDayNumber) + DayOfWeek.SATURDAY -> assertEquals(6, dayOfWeek.isoDayNumber) + DayOfWeek.SUNDAY -> assertEquals(7, dayOfWeek.isoDayNumber) + } + } + } +} diff --git a/core/common/test/MonthTest.kt b/core/common/test/MonthTest.kt new file mode 100644 index 000000000..4bf85a6a2 --- /dev/null +++ b/core/common/test/MonthTest.kt @@ -0,0 +1,31 @@ +/* + * Copyright 2019-2024 JetBrains s.r.o. and contributors. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +package kotlinx.datetime.test + +import kotlinx.datetime.* +import kotlin.test.* + +class MonthTest { + @Test + fun testExhaustiveWhen() { + for (month in Month.entries) { + when (month) { + Month.JANUARY -> assertEquals(1, month.number) + Month.FEBRUARY -> assertEquals(2, month.number) + Month.MARCH -> assertEquals(3, month.number) + Month.APRIL -> assertEquals(4, month.number) + Month.MAY -> assertEquals(5, month.number) + Month.JUNE -> assertEquals(6, month.number) + Month.JULY -> assertEquals(7, month.number) + Month.AUGUST -> assertEquals(8, month.number) + Month.SEPTEMBER -> assertEquals(9, month.number) + Month.OCTOBER -> assertEquals(10, month.number) + Month.NOVEMBER -> assertEquals(11, month.number) + Month.DECEMBER -> assertEquals(12, month.number) + } + } + } +} diff --git a/core/commonKotlin/src/Instant.kt b/core/commonKotlin/src/Instant.kt index 439aa7053..b4cff744c 100644 --- a/core/commonKotlin/src/Instant.kt +++ b/core/commonKotlin/src/Instant.kt @@ -16,16 +16,6 @@ import kotlin.time.* import kotlin.time.Duration.Companion.nanoseconds import kotlin.time.Duration.Companion.seconds -public actual enum class DayOfWeek { - MONDAY, - TUESDAY, - WEDNESDAY, - THURSDAY, - FRIDAY, - SATURDAY, - SUNDAY; -} - /** * The minimum supported epoch second. */ diff --git a/core/commonKotlin/src/Month.kt b/core/commonKotlin/src/Month.kt index fa5995cca..eaebe26eb 100644 --- a/core/commonKotlin/src/Month.kt +++ b/core/commonKotlin/src/Month.kt @@ -5,10 +5,6 @@ package kotlinx.datetime -public actual enum class Month { - JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER; -} - // From threetenbp internal fun Month.firstDayOfYear(leapYear: Boolean): Int { val leap = if (leapYear) 1 else 0 diff --git a/core/jvm/src/Converters.kt b/core/jvm/src/Converters.kt index 6db8339d3..688b0f84a 100644 --- a/core/jvm/src/Converters.kt +++ b/core/jvm/src/Converters.kt @@ -93,3 +93,22 @@ public fun UtcOffset.toJavaZoneOffset(): java.time.ZoneOffset = this.zoneOffset */ public fun java.time.ZoneOffset.toKotlinUtcOffset(): UtcOffset = UtcOffset(this) +/** + * Converts this [kotlinx.datetime.Month][Month] value to a [java.time.Month][java.time.Month] value. + */ +public fun Month.toJavaMonth(): java.time.Month = java.time.Month.of(number) + +/** + * Converts this [java.time.Month][java.time.Month] value to a [kotlinx.datetime.Month][Month] value. + */ +public fun java.time.Month.toKotlinMonth(): Month = Month.entries[this.value - 1] + +/** + * Converts this [kotlinx.datetime.DayOfWeek][DayOfWeek] value to a [java.time.DayOfWeek][java.time.DayOfWeek] value. + */ +public fun DayOfWeek.toJavaDayOfWeek(): java.time.DayOfWeek = java.time.DayOfWeek.of(isoDayNumber) + +/** + * Converts this [java.time.DayOfWeek][java.time.DayOfWeek] value to a [kotlinx.datetime.DayOfWeek][DayOfWeek] value. + */ +public fun java.time.DayOfWeek.toKotlinDayOfWeek(): DayOfWeek = DayOfWeek.entries[this.value - 1] diff --git a/core/jvm/src/DayOfWeekJvm.kt b/core/jvm/src/DayOfWeekJvm.kt new file mode 100644 index 000000000..cd9a45f93 --- /dev/null +++ b/core/jvm/src/DayOfWeekJvm.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2019-2025 JetBrains s.r.o. and contributors. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +@file:JvmName("DayOfWeekKt") +@file:JvmMultifileClass +package kotlinx.datetime + +@Deprecated("Use kotlinx.datetime.DayOfWeek", ReplaceWith("toKotlinDayOfWeek().isoDayNumber")) +public val java.time.DayOfWeek.isoDayNumber: Int get() = toKotlinDayOfWeek().isoDayNumber + +@Deprecated( + message = "This overload is only kept for binary compatibility", + level = DeprecationLevel.HIDDEN, +) +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +@kotlin.internal.LowPriorityInOverloadResolution +public fun DayOfWeek(isoDayNumber: Int): java.time.DayOfWeek = + DayOfWeek(isoDayNumber).toJavaDayOfWeek() diff --git a/core/jvm/src/LocalDate.kt b/core/jvm/src/LocalDate.kt index 030f6060a..9dc8e8017 100644 --- a/core/jvm/src/LocalDate.kt +++ b/core/jvm/src/LocalDate.kt @@ -67,14 +67,23 @@ public actual class LocalDate internal constructor(internal val value: jtLocalDa public actual constructor(year: Int, month: Month, day: Int) : this(year, month.number, day) + @Deprecated( + "Use kotlinx.datetime.Month", + ReplaceWith("LocalDate(year, month.toKotlinMonth(), dayOfMonth)") + ) + public constructor(year: Int, month: java.time.Month, dayOfMonth: Int) : + this(year, month.toKotlinMonth(), dayOfMonth) + public actual val year: Int get() = value.year @Deprecated("Use the 'month' property instead", ReplaceWith("this.month.number"), level = DeprecationLevel.WARNING) public actual val monthNumber: Int get() = value.monthValue - public actual val month: Month get() = value.month + public actual val month: Month get() = value.month.toKotlinMonth() + @PublishedApi internal fun getMonth(): java.time.Month = value.month @Deprecated("Use the 'day' property instead", ReplaceWith("this.day"), level = DeprecationLevel.WARNING) public actual val dayOfMonth: Int get() = value.dayOfMonth public actual val day: Int get() = value.dayOfMonth - public actual val dayOfWeek: DayOfWeek get() = value.dayOfWeek + public actual val dayOfWeek: DayOfWeek get() = value.dayOfWeek.toKotlinDayOfWeek() + @PublishedApi internal fun getDayOfWeek(): java.time.DayOfWeek = value.dayOfWeek public actual val dayOfYear: Int get() = value.dayOfYear override fun equals(other: Any?): Boolean = @@ -93,6 +102,19 @@ public actual class LocalDate internal constructor(internal val value: jtLocalDa internal fun toEpochDaysJvm(): Int = value.toEpochDay().clampToInt() } +/** + * @suppress + */ +@Deprecated( + "Use the constructor that accepts a 'day'", + ReplaceWith("LocalDate(year = year, month = month.toKotlinMonth(), day = dayOfMonth)"), + level = DeprecationLevel.WARNING +) +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +@LowPriorityInOverloadResolution +public fun LocalDate(year: Int, month: java.time.Month, dayOfMonth: Int): LocalDate = + LocalDate(year = year, month = month.toKotlinMonth(), day = dayOfMonth) + @Deprecated("Use the plus overload with an explicit number of units", ReplaceWith("this.plus(1, unit)")) public actual fun LocalDate.plus(unit: DateTimeUnit.DateBased): LocalDate = plus(1L, unit) diff --git a/core/jvm/src/LocalDateTime.kt b/core/jvm/src/LocalDateTimeJvm.kt similarity index 71% rename from core/jvm/src/LocalDateTime.kt rename to core/jvm/src/LocalDateTimeJvm.kt index 89df0eb84..77f4d87bd 100644 --- a/core/jvm/src/LocalDateTime.kt +++ b/core/jvm/src/LocalDateTimeJvm.kt @@ -2,7 +2,8 @@ * Copyright 2019-2022 JetBrains s.r.o. and contributors. * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ -@file:JvmName("LocalDateTimeJvmKt") +@file:JvmName("LocalDateTimeKt") +@file:JvmMultifileClass package kotlinx.datetime import kotlinx.datetime.format.* @@ -13,9 +14,6 @@ import java.time.DateTimeException import java.time.format.DateTimeParseException import java.time.LocalDateTime as jtLocalDateTime -public actual typealias Month = java.time.Month -public actual typealias DayOfWeek = java.time.DayOfWeek - @Serializable(with = LocalDateTimeIso8601Serializer::class) public actual class LocalDateTime internal constructor(internal val value: jtLocalDateTime) : Comparable { @@ -32,14 +30,38 @@ public actual class LocalDateTime internal constructor(internal val value: jtLoc public actual constructor(date: LocalDate, time: LocalTime) : this(jtLocalDateTime.of(date.value, time.value)) + @Deprecated( + "Use kotlinx.datetime.Month", + ReplaceWith("LocalDateTime(year, month.toKotlinMonth(), dayOfMonth, hour, minute, second, nanosecond)") + ) + public constructor( + year: Int, + month: java.time.Month, + dayOfMonth: Int, + hour: Int, + minute: Int, + second: Int = 0, + nanosecond: Int = 0 + ) : this( + year, + month.toKotlinMonth(), + dayOfMonth, + hour, + minute, + second, + nanosecond + ) + public actual val year: Int get() = value.year @Deprecated("Use the 'month' property instead", ReplaceWith("this.month.number"), level = DeprecationLevel.WARNING) public actual val monthNumber: Int get() = value.monthValue - public actual val month: Month get() = value.month + public actual val month: Month get() = value.month.toKotlinMonth() + @PublishedApi internal fun getMonth(): java.time.Month = value.month @Deprecated("Use the 'day' property instead", ReplaceWith("this.day"), level = DeprecationLevel.WARNING) public actual val dayOfMonth: Int get() = value.dayOfMonth public actual val day: Int get() = value.dayOfMonth - public actual val dayOfWeek: DayOfWeek get() = value.dayOfWeek + public actual val dayOfWeek: DayOfWeek get() = value.dayOfWeek.toKotlinDayOfWeek() + @PublishedApi internal fun getDayOfWeek(): java.time.DayOfWeek = value.dayOfWeek public actual val dayOfYear: Int get() = value.dayOfYear public actual val hour: Int get() = value.hour @@ -89,3 +111,26 @@ public actual class LocalDateTime internal constructor(internal val value: jtLoc } } + +/** + * @suppress + */ +@Deprecated( + "Use the constructor that accepts a 'day'", + ReplaceWith("LocalDateTime(year = year, month = month.toKotlinMonth(), day = dayOfMonth, hour = hour, minute = minute, second = second, nanosecond = nanosecond)"), + level = DeprecationLevel.WARNING +) +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +@kotlin.internal.LowPriorityInOverloadResolution +public fun LocalDateTime( + year: Int, + month: java.time.Month, + dayOfMonth: Int, + hour: Int, + minute: Int, + second: Int = 0, + nanosecond: Int = 0, +): LocalDateTime = LocalDateTime( + year = year, month = month.toKotlinMonth(), day = dayOfMonth, + hour = hour, minute = minute, second = second, nanosecond = nanosecond +) diff --git a/core/jvm/src/LocalTime.kt b/core/jvm/src/LocalTimeJvm.kt similarity index 80% rename from core/jvm/src/LocalTime.kt rename to core/jvm/src/LocalTimeJvm.kt index 71052570f..20a033014 100644 --- a/core/jvm/src/LocalTime.kt +++ b/core/jvm/src/LocalTimeJvm.kt @@ -2,7 +2,8 @@ * Copyright 2019-2022 JetBrains s.r.o. and contributors. * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. */ -@file:JvmName("LocalTimeJvmKt") +@file:JvmName("LocalTimeKt") +@file:JvmMultifileClass package kotlinx.datetime @@ -90,3 +91,23 @@ public actual class LocalTime internal constructor(internal val value: jtLocalTi } } + +@Deprecated( + "Use kotlinx.datetime.Month", + ReplaceWith("atDate(year, month.toKotlinMonth(), dayOfMonth)") +) +public fun LocalTime.atDate(year: Int, month: java.time.Month, dayOfMonth: Int = 0): LocalDateTime = + atDate(year, month.toKotlinMonth(), dayOfMonth) + +/** @suppress */ +@Deprecated( + "Use the overload that accepts a 'month' and a 'day' instead", + ReplaceWith("this.atDate(year = year, month = month.toKotlinMonth(), day = dayOfMonth)"), + DeprecationLevel.WARNING +) +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +@kotlin.internal.LowPriorityInOverloadResolution +public fun LocalTime.atDate(year: Int, month: java.time.Month, dayOfMonth: Int, fakeArgument: Unit = Unit): LocalDateTime = + fakeArgument.let { + LocalDateTime(year, month.toKotlinMonth(), dayOfMonth, hour, minute, second, nanosecond) + } diff --git a/core/jvm/src/MonthJvm.kt b/core/jvm/src/MonthJvm.kt new file mode 100644 index 000000000..5efee4af6 --- /dev/null +++ b/core/jvm/src/MonthJvm.kt @@ -0,0 +1,25 @@ +/* + * Copyright 2019-2025 JetBrains s.r.o. and contributors. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ + +@file:JvmName("MonthKt") +@file:JvmMultifileClass +package kotlinx.datetime + +/** + * @suppress + */ +@Deprecated("Use kotlinx.datetime.Month", ReplaceWith("toKotlinMonth().number")) +public val java.time.Month.number: Int get() = this.toKotlinMonth().number + +/** + * @suppress + */ +@Deprecated( + message = "This overload is only kept for binary compatibility", + level = DeprecationLevel.HIDDEN, +) +@Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE") +@kotlin.internal.LowPriorityInOverloadResolution +public fun Month(number: Int): java.time.Month = kotlinx.datetime.Month(number).toJavaMonth() diff --git a/core/jvm/test/ConvertersTest.kt b/core/jvm/test/ConvertersTest.kt index 52b8c243a..06b7e2239 100644 --- a/core/jvm/test/ConvertersTest.kt +++ b/core/jvm/test/ConvertersTest.kt @@ -26,7 +26,7 @@ class ConvertersTest { assertEquals(ktInstant, jtInstant.toKotlinInstant()) assertEquals(jtInstant, ktInstant.toJavaInstant()) - assertEquals(ktInstant, jtInstant.toString().toInstant()) + assertEquals(ktInstant, jtInstant.toString().let(Instant::parse)) assertEquals(jtInstant, ktInstant.toString().let(JTInstant::parse)) } @@ -37,10 +37,11 @@ class ConvertersTest { } } + @OptIn(ExperimentalStdlibApi::class) private fun randomDate(): LocalDate { val year = Random.nextInt(-20000, 20000) val month = Month.entries.random() - val day = (1..java.time.YearMonth.of(year, month).lengthOfMonth()).random() + val day = (1..java.time.YearMonth.of(year, month.toJavaMonth()).lengthOfMonth()).random() return LocalDate(year, month.number, day) } @@ -61,12 +62,14 @@ class ConvertersTest { @Test fun localDateTime() { fun test(ktDateTime: LocalDateTime) { - val jtDateTime = with(ktDateTime) { JTLocalDateTime.of(year, month, day, hour, minute, second, nanosecond) } + val jtDateTime = with(ktDateTime) { + JTLocalDateTime.of(year, month.toJavaMonth(), day, hour, minute, second, nanosecond) + } assertEquals(ktDateTime, jtDateTime.toKotlinLocalDateTime()) assertEquals(jtDateTime, ktDateTime.toJavaLocalDateTime()) - assertEquals(ktDateTime, jtDateTime.toString().toLocalDateTime()) + assertEquals(ktDateTime, jtDateTime.toString().let(LocalDateTime::parse)) assertEquals(jtDateTime, ktDateTime.toString().let(JTLocalDateTime::parse)) } @@ -83,7 +86,7 @@ class ConvertersTest { assertEquals(ktTime, jtTime.toKotlinLocalTime()) assertEquals(jtTime, ktTime.toJavaLocalTime()) - assertEquals(ktTime, jtTime.toString().toLocalTime()) + assertEquals(ktTime, jtTime.toString().let(LocalTime::parse)) assertEquals(jtTime, ktTime.toString().let(JTLocalTime::parse)) } @@ -95,12 +98,12 @@ class ConvertersTest { @Test fun localDate() { fun test(ktDate: LocalDate) { - val jtDate = with(ktDate) { JTLocalDate.of(year, month, day) } + val jtDate = with(ktDate) { JTLocalDate.of(year, month.toJavaMonth(), day) } assertEquals(ktDate, jtDate.toKotlinLocalDate()) assertEquals(jtDate, ktDate.toJavaLocalDate()) - assertEquals(ktDate, jtDate.toString().toLocalDate()) + assertEquals(ktDate, jtDate.toString().let(LocalDate::parse)) assertEquals(jtDate, ktDate.toString().let(JTLocalDate::parse)) } @@ -187,4 +190,26 @@ class ConvertersTest { test("+08") test("-103030") } + + @Test + fun month() { + fun test(month: Month) { + val jtMonth = month.toJavaMonth() + assertEquals(month, jtMonth.toKotlinMonth()) + assertEquals(month.name, jtMonth.name) + } + Month.entries.forEach(::test) + assertEquals(Month.JANUARY, java.time.Month.JANUARY.toKotlinMonth()) + } + + @Test + fun dayOfWeek() { + fun test(dayOfWeek: DayOfWeek) { + val jtDayOfWeek = dayOfWeek.toJavaDayOfWeek() + assertEquals(dayOfWeek, jtDayOfWeek.toKotlinDayOfWeek()) + assertEquals(dayOfWeek.name, jtDayOfWeek.name) + } + DayOfWeek.entries.forEach(::test) + assertEquals(DayOfWeek.MONDAY, java.time.DayOfWeek.MONDAY.toKotlinDayOfWeek()) + } } diff --git a/core/jvm/test/DeprecationReplacements.kt b/core/jvm/test/DeprecationReplacements.kt new file mode 100644 index 000000000..d0c807fd5 --- /dev/null +++ b/core/jvm/test/DeprecationReplacements.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2019-2024 JetBrains s.r.o. and contributors. + * Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file. + */ +package kotlinx.datetime.test + +import kotlinx.datetime.* + +/** + * To test the deprecation replacements, remove the `Suppress` annotation and try automatically replacing the deprecated + * API usages with the new ones. + */ +@Suppress("DEPRECATION") +class DeprecationReplacements { + fun localTimeAtDate() { + LocalTime(18, 43, 15, 100500000) + .atDate(2023, java.time.Month.JANUARY, 20) + } + + fun monthNumber() { + java.time.Month.JANUARY.number + } + + fun localDateConstruction() { + LocalDate(2023, java.time.Month.JANUARY, 20) + } + + fun localDateTimeConstruction() { + LocalDateTime(2023, java.time.Month.JANUARY, 20, 18, 43, 15, 100500000) + LocalDateTime(2023, java.time.Month.JANUARY, 20, 18, 43, 15) + LocalDateTime(2023, java.time.Month.JANUARY, 20, 18, 43) + } +}