// appropriate), record the DST_OFFSET before and after the add()
// operation. If it has changed, then adjust the millis to
// compensate.
- int32_t dst = 0;
+ int32_t prevOffset = 0;
int32_t hour = 0;
if (keepHourInvariant) {
- dst = get(UCAL_DST_OFFSET, status) + get(UCAL_ZONE_OFFSET, status);
+ prevOffset = get(UCAL_DST_OFFSET, status) + get(UCAL_ZONE_OFFSET, status);
hour = internalGet(UCAL_HOUR_OF_DAY);
}
setTimeInMillis(getTimeInMillis(status) + delta, status);
if (keepHourInvariant) {
- dst -= get(UCAL_DST_OFFSET, status) + get(UCAL_ZONE_OFFSET, status);
- if (dst != 0) {
+ int32_t newOffset = get(UCAL_DST_OFFSET, status) + get(UCAL_ZONE_OFFSET, status);
+ if (newOffset != prevOffset) {
// We have done an hour-invariant adjustment but the
// DST offset has altered. We adjust millis to keep
// the hour constant. In cases such as midnight after
// this we make the adjustment only if it actually
// maintains the hour.
double t = internalGetTime();
- setTimeInMillis(t + dst, status);
+ setTimeInMillis(t + prevOffset - newOffset, status);
if (get(UCAL_HOUR_OF_DAY, status) != hour) {
setTimeInMillis(t, status);
}