@@ -181,20 +181,24 @@ public actual fun Instant.plus(period: DateTimePeriod, timeZone: TimeZone): Inst
181181 with (period) {
182182 val initialOffset = offsetIn(timeZone)
183183 val initialLdt = toLocalDateTimeFailing(initialOffset)
184+ val instantAfterMonths: Instant
184185 val offsetAfterMonths: UtcOffset
185186 val ldtAfterMonths: LocalDateTime
186187 if (totalMonths != 0L ) {
187- val (ldt, offset) = timeZone.atZone(initialLdt.plus(totalMonths, DateTimeUnit .MONTH ), initialOffset)
188- offsetAfterMonths = offset
189- ldtAfterMonths = ldt
188+ val unresolvedLdtWithMonths = initialLdt.plus(totalMonths, DateTimeUnit .MONTH )
189+ instantAfterMonths = timeZone.localDateTimeToInstant(unresolvedLdtWithMonths, initialOffset)
190+ offsetAfterMonths = instantAfterMonths.offsetIn(timeZone)
191+ ldtAfterMonths = instantAfterMonths.toLocalDateTimeFailing(offsetAfterMonths)
190192 } else {
193+ instantAfterMonths = this @plus
191194 offsetAfterMonths = initialOffset
192195 ldtAfterMonths = initialLdt
193196 }
194197 val instantAfterMonthsAndDays = if (days != 0 ) {
195- timeZone.atZone(ldtAfterMonths.plus(days, DateTimeUnit .DAY ), offsetAfterMonths).toInstant()
198+ val unresolvedLdtWithDays = ldtAfterMonths.plus(days, DateTimeUnit .DAY )
199+ timeZone.localDateTimeToInstant(unresolvedLdtWithDays, offsetAfterMonths)
196200 } else {
197- ldtAfterMonths.toInstant(offsetAfterMonths)
201+ instantAfterMonths
198202 }
199203 instantAfterMonthsAndDays
200204 .run { if (totalNanoseconds != 0L ) plus(0 , totalNanoseconds).check(timeZone) else this }
@@ -215,9 +219,9 @@ public actual fun Instant.minus(value: Int, unit: DateTimeUnit, timeZone: TimeZo
215219public actual fun Instant.plus (value : Long , unit : DateTimeUnit , timeZone : TimeZone ): Instant = try {
216220 when (unit) {
217221 is DateTimeUnit .DateBased -> {
218- val preferredOffset = offsetIn(timeZone)
219- val initialLdt = toLocalDateTimeFailing(preferredOffset )
220- timeZone.atZone (initialLdt.plus(value, unit), preferredOffset).toInstant( )
222+ val initialOffset = offsetIn(timeZone)
223+ val initialLdt = toLocalDateTimeFailing(initialOffset )
224+ timeZone.localDateTimeToInstant (initialLdt.plus(value, unit), preferred = initialOffset )
221225 }
222226 is DateTimeUnit .TimeBased ->
223227 check(timeZone).plus(value, unit).check(timeZone)
@@ -240,15 +244,21 @@ public actual fun Instant.plus(value: Long, unit: DateTimeUnit.TimeBased): Insta
240244 }
241245
242246public actual fun Instant.periodUntil (other : Instant , timeZone : TimeZone ): DateTimePeriod {
243- val thisOffset1 = offsetIn(timeZone)
244- val thisLdt1 = toLocalDateTimeFailing(thisOffset1 )
247+ val initialOffset = offsetIn(timeZone)
248+ val initialLdt = toLocalDateTimeFailing(initialOffset )
245249 val otherLdt = other.toLocalDateTimeFailing(other.offsetIn(timeZone))
246250
247- val months = thisLdt1.until(otherLdt, DateTimeUnit .MONTH ) // `until` on dates never fails
248- val (thisLdt2, thisOffset2) = timeZone.atZone(thisLdt1.plus(months, DateTimeUnit .MONTH ), thisOffset1) // won't throw: thisLdt + months <= otherLdt, which is known to be valid
249- val days = thisLdt2.until(otherLdt, DateTimeUnit .DAY ) // `until` on dates never fails
250- val (thisLdt3, thisOffset3) = timeZone.atZone(thisLdt2.plus(days, DateTimeUnit .DAY ), thisOffset2) // won't throw: thisLdt + days <= otherLdt
251- val nanoseconds = thisLdt3.toInstant(thisOffset3).until(other, DateTimeUnit .NANOSECOND ) // |otherLdt - thisLdt| < 24h
251+ val months = initialLdt.until(otherLdt, DateTimeUnit .MONTH ) // `until` on dates never fails
252+ val unresolvedLdtWithMonths = initialLdt.plus(months, DateTimeUnit .MONTH )
253+ // won't throw: thisLdt + months <= otherLdt, which is known to be valid
254+ val instantWithMonths = timeZone.localDateTimeToInstant(unresolvedLdtWithMonths, preferred = initialOffset)
255+ val offsetWithMonths = instantWithMonths.offsetIn(timeZone)
256+ val ldtWithMonths = instantWithMonths.toLocalDateTimeFailing(offsetWithMonths)
257+ val days = ldtWithMonths.until(otherLdt, DateTimeUnit .DAY ) // `until` on dates never fails
258+ val unresolvedLdtWithDays = ldtWithMonths.plus(days, DateTimeUnit .DAY )
259+ val newInstant = timeZone.localDateTimeToInstant(unresolvedLdtWithDays, preferred = initialOffset)
260+ // won't throw: thisLdt + days <= otherLdt
261+ val nanoseconds = newInstant.until(other, DateTimeUnit .NANOSECOND ) // |otherLdt - thisLdt| < 24h
252262
253263 return buildDateTimePeriod(months, days.toInt(), nanoseconds)
254264}
0 commit comments