@@ -185,20 +185,24 @@ public actual fun Instant.plus(period: DateTimePeriod, timeZone: TimeZone): Inst
185
185
with (period) {
186
186
val initialOffset = offsetIn(timeZone)
187
187
val initialLdt = toLocalDateTimeFailing(initialOffset)
188
+ val instantAfterMonths: Instant
188
189
val offsetAfterMonths: UtcOffset
189
190
val ldtAfterMonths: LocalDateTime
190
191
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)
194
196
} else {
197
+ instantAfterMonths = this @plus
195
198
offsetAfterMonths = initialOffset
196
199
ldtAfterMonths = initialLdt
197
200
}
198
201
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)
200
204
} else {
201
- ldtAfterMonths.toInstant(offsetAfterMonths)
205
+ instantAfterMonths
202
206
}
203
207
instantAfterMonthsAndDays
204
208
.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
219
223
public actual fun Instant.plus (value : Long , unit : DateTimeUnit , timeZone : TimeZone ): Instant = try {
220
224
when (unit) {
221
225
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 )
225
229
}
226
230
is DateTimeUnit .TimeBased ->
227
231
check(timeZone).plus(value, unit).check(timeZone)
@@ -244,15 +248,21 @@ public actual fun Instant.plus(value: Long, unit: DateTimeUnit.TimeBased): Insta
244
248
}
245
249
246
250
public 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 )
249
253
val otherLdt = other.toLocalDateTimeFailing(other.offsetIn(timeZone))
250
254
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
256
266
257
267
return buildDateTimePeriod(months, days.toInt(), nanoseconds)
258
268
}
0 commit comments