@@ -171,20 +171,24 @@ public actual fun Instant.plus(period: DateTimePeriod, timeZone: TimeZone): Inst
171
171
with (period) {
172
172
val initialOffset = offsetIn(timeZone)
173
173
val initialLdt = toLocalDateTimeFailing(initialOffset)
174
+ val instantAfterMonths: Instant
174
175
val offsetAfterMonths: UtcOffset
175
176
val ldtAfterMonths: LocalDateTime
176
177
if (totalMonths != 0L ) {
177
- val (ldt, offset) = timeZone.atZone(initialLdt.plus(totalMonths, DateTimeUnit .MONTH ), initialOffset)
178
- offsetAfterMonths = offset
179
- ldtAfterMonths = ldt
178
+ val unresolvedLdtWithMonths = initialLdt.plus(totalMonths, DateTimeUnit .MONTH )
179
+ instantAfterMonths = timeZone.localDateTimeToInstant(unresolvedLdtWithMonths, initialOffset)
180
+ offsetAfterMonths = instantAfterMonths.offsetIn(timeZone)
181
+ ldtAfterMonths = instantAfterMonths.toLocalDateTimeFailing(offsetAfterMonths)
180
182
} else {
183
+ instantAfterMonths = this @plus
181
184
offsetAfterMonths = initialOffset
182
185
ldtAfterMonths = initialLdt
183
186
}
184
187
val instantAfterMonthsAndDays = if (days != 0 ) {
185
- timeZone.atZone(ldtAfterMonths.plus(days, DateTimeUnit .DAY ), offsetAfterMonths).toInstant()
188
+ val unresolvedLdtWithDays = ldtAfterMonths.plus(days, DateTimeUnit .DAY )
189
+ timeZone.localDateTimeToInstant(unresolvedLdtWithDays, offsetAfterMonths)
186
190
} else {
187
- ldtAfterMonths.toInstant(offsetAfterMonths)
191
+ instantAfterMonths
188
192
}
189
193
instantAfterMonthsAndDays
190
194
.run { if (totalNanoseconds != 0L ) plus(0 , totalNanoseconds).check(timeZone) else this }
@@ -205,9 +209,9 @@ public actual fun Instant.minus(value: Int, unit: DateTimeUnit, timeZone: TimeZo
205
209
public actual fun Instant.plus (value : Long , unit : DateTimeUnit , timeZone : TimeZone ): Instant = try {
206
210
when (unit) {
207
211
is DateTimeUnit .DateBased -> {
208
- val preferredOffset = offsetIn(timeZone)
209
- val initialLdt = toLocalDateTimeFailing(preferredOffset )
210
- timeZone.atZone (initialLdt.plus(value, unit), preferredOffset).toInstant( )
212
+ val initialOffset = offsetIn(timeZone)
213
+ val initialLdt = toLocalDateTimeFailing(initialOffset )
214
+ timeZone.localDateTimeToInstant (initialLdt.plus(value, unit), preferred = initialOffset )
211
215
}
212
216
is DateTimeUnit .TimeBased ->
213
217
check(timeZone).plus(value, unit).check(timeZone)
@@ -230,15 +234,21 @@ public actual fun Instant.plus(value: Long, unit: DateTimeUnit.TimeBased): Insta
230
234
}
231
235
232
236
public actual fun Instant.periodUntil (other : Instant , timeZone : TimeZone ): DateTimePeriod {
233
- val thisOffset1 = offsetIn(timeZone)
234
- val thisLdt1 = toLocalDateTimeFailing(thisOffset1 )
237
+ val initialOffset = offsetIn(timeZone)
238
+ val initialLdt = toLocalDateTimeFailing(initialOffset )
235
239
val otherLdt = other.toLocalDateTimeFailing(other.offsetIn(timeZone))
236
240
237
- val months = thisLdt1.until(otherLdt, DateTimeUnit .MONTH ) // `until` on dates never fails
238
- val (thisLdt2, thisOffset2) = timeZone.atZone(thisLdt1.plus(months, DateTimeUnit .MONTH ), thisOffset1) // won't throw: thisLdt + months <= otherLdt, which is known to be valid
239
- val days = thisLdt2.until(otherLdt, DateTimeUnit .DAY ) // `until` on dates never fails
240
- val (thisLdt3, thisOffset3) = timeZone.atZone(thisLdt2.plus(days, DateTimeUnit .DAY ), thisOffset2) // won't throw: thisLdt + days <= otherLdt
241
- val nanoseconds = thisLdt3.toInstant(thisOffset3).until(other, DateTimeUnit .NANOSECOND ) // |otherLdt - thisLdt| < 24h
241
+ val months = initialLdt.until(otherLdt, DateTimeUnit .MONTH ) // `until` on dates never fails
242
+ val unresolvedLdtWithMonths = initialLdt.plus(months, DateTimeUnit .MONTH )
243
+ // won't throw: thisLdt + months <= otherLdt, which is known to be valid
244
+ val instantWithMonths = timeZone.localDateTimeToInstant(unresolvedLdtWithMonths, preferred = initialOffset)
245
+ val offsetWithMonths = instantWithMonths.offsetIn(timeZone)
246
+ val ldtWithMonths = instantWithMonths.toLocalDateTimeFailing(offsetWithMonths)
247
+ val days = ldtWithMonths.until(otherLdt, DateTimeUnit .DAY ) // `until` on dates never fails
248
+ val unresolvedLdtWithDays = ldtWithMonths.plus(days, DateTimeUnit .DAY )
249
+ val newInstant = timeZone.localDateTimeToInstant(unresolvedLdtWithDays, preferred = initialOffset)
250
+ // won't throw: thisLdt + days <= otherLdt
251
+ val nanoseconds = newInstant.until(other, DateTimeUnit .NANOSECOND ) // |otherLdt - thisLdt| < 24h
242
252
243
253
return buildDateTimePeriod(months, days.toInt(), nanoseconds)
244
254
}
0 commit comments