@@ -185,20 +185,24 @@ public actual fun Instant.plus(period: DateTimePeriod, timeZone: TimeZone): Inst
185185 with (period) {
186186 val initialOffset = offsetIn(timeZone)
187187 val initialLdt = toLocalDateTimeFailing(initialOffset)
188+ val instantAfterMonths: Instant
188189 val offsetAfterMonths: UtcOffset
189190 val ldtAfterMonths: LocalDateTime
190191 if (totalMonths != 0L ) {
191- val (ldt, offset) = timeZone.atZone(initialLdt.plus(totalMonths, DateTimeUnit .MONTH ), initialOffset)
192- offsetAfterMonths = offset
193- ldtAfterMonths = ldt
192+ val unresolvedLdtWithMonths = initialLdt.plus(totalMonths, DateTimeUnit .MONTH )
193+ instantAfterMonths = timeZone.localDateTimeToInstant(unresolvedLdtWithMonths, initialOffset)
194+ offsetAfterMonths = instantAfterMonths.offsetIn(timeZone)
195+ ldtAfterMonths = instantAfterMonths.toLocalDateTimeFailing(offsetAfterMonths)
194196 } else {
197+ instantAfterMonths = this @plus
195198 offsetAfterMonths = initialOffset
196199 ldtAfterMonths = initialLdt
197200 }
198201 val instantAfterMonthsAndDays = if (days != 0 ) {
199- timeZone.atZone(ldtAfterMonths.plus(days, DateTimeUnit .DAY ), offsetAfterMonths).toInstant()
202+ val unresolvedLdtWithDays = ldtAfterMonths.plus(days, DateTimeUnit .DAY )
203+ timeZone.localDateTimeToInstant(unresolvedLdtWithDays, offsetAfterMonths)
200204 } else {
201- ldtAfterMonths.toInstant(offsetAfterMonths)
205+ instantAfterMonths
202206 }
203207 instantAfterMonthsAndDays
204208 .run { if (totalNanoseconds != 0L ) plus(0 , totalNanoseconds).check(timeZone) else this }
@@ -219,9 +223,9 @@ public actual fun Instant.minus(value: Int, unit: DateTimeUnit, timeZone: TimeZo
219223public actual fun Instant.plus (value : Long , unit : DateTimeUnit , timeZone : TimeZone ): Instant = try {
220224 when (unit) {
221225 is DateTimeUnit .DateBased -> {
222- val preferredOffset = offsetIn(timeZone)
223- val initialLdt = toLocalDateTimeFailing(preferredOffset )
224- timeZone.atZone (initialLdt.plus(value, unit), preferredOffset).toInstant( )
226+ val initialOffset = offsetIn(timeZone)
227+ val initialLdt = toLocalDateTimeFailing(initialOffset )
228+ timeZone.localDateTimeToInstant (initialLdt.plus(value, unit), preferred = initialOffset )
225229 }
226230 is DateTimeUnit .TimeBased ->
227231 check(timeZone).plus(value, unit).check(timeZone)
@@ -244,15 +248,21 @@ public actual fun Instant.plus(value: Long, unit: DateTimeUnit.TimeBased): Insta
244248 }
245249
246250public actual fun Instant.periodUntil (other : Instant , timeZone : TimeZone ): DateTimePeriod {
247- val thisOffset1 = offsetIn(timeZone)
248- val thisLdt1 = toLocalDateTimeFailing(thisOffset1 )
251+ val initialOffset = offsetIn(timeZone)
252+ val initialLdt = toLocalDateTimeFailing(initialOffset )
249253 val otherLdt = other.toLocalDateTimeFailing(other.offsetIn(timeZone))
250254
251- val months = thisLdt1.until(otherLdt, DateTimeUnit .MONTH ) // `until` on dates never fails
252- val (thisLdt2, thisOffset2) = timeZone.atZone(thisLdt1.plus(months, DateTimeUnit .MONTH ), thisOffset1) // won't throw: thisLdt + months <= otherLdt, which is known to be valid
253- val days = thisLdt2.until(otherLdt, DateTimeUnit .DAY ) // `until` on dates never fails
254- val (thisLdt3, thisOffset3) = timeZone.atZone(thisLdt2.plus(days, DateTimeUnit .DAY ), thisOffset2) // won't throw: thisLdt + days <= otherLdt
255- val nanoseconds = thisLdt3.toInstant(thisOffset3).until(other, DateTimeUnit .NANOSECOND ) // |otherLdt - thisLdt| < 24h
255+ val months = initialLdt.until(otherLdt, DateTimeUnit .MONTH ) // `until` on dates never fails
256+ val unresolvedLdtWithMonths = initialLdt.plus(months, DateTimeUnit .MONTH )
257+ // won't throw: thisLdt + months <= otherLdt, which is known to be valid
258+ val instantWithMonths = timeZone.localDateTimeToInstant(unresolvedLdtWithMonths, preferred = initialOffset)
259+ val offsetWithMonths = instantWithMonths.offsetIn(timeZone)
260+ val ldtWithMonths = instantWithMonths.toLocalDateTimeFailing(offsetWithMonths)
261+ val days = ldtWithMonths.until(otherLdt, DateTimeUnit .DAY ) // `until` on dates never fails
262+ val unresolvedLdtWithDays = ldtWithMonths.plus(days, DateTimeUnit .DAY )
263+ val newInstant = timeZone.localDateTimeToInstant(unresolvedLdtWithDays, preferred = initialOffset)
264+ // won't throw: thisLdt + days <= otherLdt
265+ val nanoseconds = newInstant.until(other, DateTimeUnit .NANOSECOND ) // |otherLdt - thisLdt| < 24h
256266
257267 return buildDateTimePeriod(months, days.toInt(), nanoseconds)
258268}
0 commit comments