@@ -181,20 +181,24 @@ public actual fun Instant.plus(period: DateTimePeriod, timeZone: TimeZone): Inst
181
181
with (period) {
182
182
val initialOffset = offsetIn(timeZone)
183
183
val initialLdt = toLocalDateTimeFailing(initialOffset)
184
+ val instantAfterMonths: Instant
184
185
val offsetAfterMonths: UtcOffset
185
186
val ldtAfterMonths: LocalDateTime
186
187
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)
190
192
} else {
193
+ instantAfterMonths = this @plus
191
194
offsetAfterMonths = initialOffset
192
195
ldtAfterMonths = initialLdt
193
196
}
194
197
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)
196
200
} else {
197
- ldtAfterMonths.toInstant(offsetAfterMonths)
201
+ instantAfterMonths
198
202
}
199
203
instantAfterMonthsAndDays
200
204
.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
215
219
public actual fun Instant.plus (value : Long , unit : DateTimeUnit , timeZone : TimeZone ): Instant = try {
216
220
when (unit) {
217
221
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 )
221
225
}
222
226
is DateTimeUnit .TimeBased ->
223
227
check(timeZone).plus(value, unit).check(timeZone)
@@ -240,15 +244,21 @@ public actual fun Instant.plus(value: Long, unit: DateTimeUnit.TimeBased): Insta
240
244
}
241
245
242
246
public 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 )
245
249
val otherLdt = other.toLocalDateTimeFailing(other.offsetIn(timeZone))
246
250
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
252
262
253
263
return buildDateTimePeriod(months, days.toInt(), nanoseconds)
254
264
}
0 commit comments