@@ -12,8 +12,8 @@ import kotlinx.datetime.internal.*
12
12
import kotlinx.datetime.serializers.InstantIso8601Serializer
13
13
import kotlinx.serialization.Serializable
14
14
import java.time.DateTimeException
15
- import java.time.format.DateTimeParseException
16
- import java.time.temporal.ChronoUnit
15
+ import java.time.format.*
16
+ import java.time.temporal.*
17
17
import kotlin.time.*
18
18
import kotlin.time.Duration.Companion.nanoseconds
19
19
import kotlin.time.Duration.Companion.seconds
@@ -67,20 +67,18 @@ public actual class Instant internal constructor(internal val value: jtInstant)
67
67
public actual fun fromEpochMilliseconds (epochMilliseconds : Long ): Instant =
68
68
Instant (jtInstant.ofEpochMilli(epochMilliseconds))
69
69
70
- public actual fun parse (input : CharSequence , format : DateTimeFormat <DateTimeComponents >): Instant =
71
- if (format == = DateTimeComponents .Formats .ISO_DATE_TIME_OFFSET ) {
72
- try {
73
- Instant (jtOffsetDateTime.parse(fixOffsetRepresentation(input)).toInstant())
74
- } catch (e: DateTimeParseException ) {
75
- throw DateTimeFormatException (e)
76
- }
77
- } else {
78
- try {
79
- format.parse(input).toInstantUsingOffset()
80
- } catch (e: IllegalArgumentException ) {
81
- throw DateTimeFormatException (" Failed to parse an instant from '$input '" , e)
82
- }
83
- }
70
+ public actual fun parse (input : CharSequence , format : DateTimeFormat <DateTimeComponents >): Instant = try {
71
+ /* *
72
+ * Can't use built-in Java Time's handling of `Instant.parse` because it supports 24:00:00 and
73
+ * 23:59:60, and also doesn't support non-`Z` UTC offsets on older JDKs.
74
+ * Can't use custom Java Time's formats because Java 8 doesn't support the UTC offset format with
75
+ * optional minutes and seconds and `:` between them:
76
+ * https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatterBuilder.html#appendOffset-java.lang.String-java.lang.String-
77
+ */
78
+ format.parse(input).toInstantUsingOffset()
79
+ } catch (e: IllegalArgumentException ) {
80
+ throw DateTimeFormatException (" Failed to parse an instant from '$input '" , e)
81
+ }
84
82
85
83
@Deprecated(" This overload is only kept for binary compatibility" , level = DeprecationLevel .HIDDEN )
86
84
public fun parse (isoString : String ): Instant = parse(input = isoString)
0 commit comments