private int localizedWOWBY(TemporalAccessor temporal) { int sow = weekDef.getFirstDayOfWeek().getValue(); int isoDow = temporal.get(DAY_OF_WEEK); int dow = Jdk8Methods.floorMod(isoDow - sow, 7) + 1; long woy = localizedWeekOfYear(temporal, dow); if (woy == 0) { ChronoLocalDate previous = Chronology.from(temporal).date(temporal).minus(1, ChronoUnit.WEEKS); return (int) localizedWeekOfYear(previous, dow) + 1; } else if (woy >= 53) { int offset = startOfWeekOffset(temporal.get(DAY_OF_YEAR), dow); int year = temporal.get(YEAR); int yearLen = Year.isLeap(year) ? 366 : 365; int weekIndexOfFirstWeekNextYear = computeWeek(offset, yearLen + weekDef.getMinimalDaysInFirstWeek()); if (woy >= weekIndexOfFirstWeekNextYear) { return (int) (woy - (weekIndexOfFirstWeekNextYear - 1)); } } return (int) woy; }
private ValueRange rangeWOWBY(TemporalAccessor temporal) { int sow = weekDef.getFirstDayOfWeek().getValue(); int isoDow = temporal.get(DAY_OF_WEEK); int dow = Jdk8Methods.floorMod(isoDow - sow, 7) + 1; long woy = localizedWeekOfYear(temporal, dow); if (woy == 0) { return rangeWOWBY(Chronology.from(temporal).date(temporal).minus(2, ChronoUnit.WEEKS)); } int offset = startOfWeekOffset(temporal.get(DAY_OF_YEAR), dow); int year = temporal.get(YEAR); int yearLen = Year.isLeap(year) ? 366 : 365; int weekIndexOfFirstWeekNextYear = computeWeek(offset, yearLen + weekDef.getMinimalDaysInFirstWeek()); if (woy >= weekIndexOfFirstWeekNextYear) { return rangeWOWBY(Chronology.from(temporal).date(temporal).plus(2, ChronoUnit.WEEKS)); } return ValueRange.of(1, weekIndexOfFirstWeekNextYear - 1); }
@Override public long until(Temporal endExclusive, TemporalUnit unit) { @SuppressWarnings("unchecked") ChronoLocalDateTime<D> end = (ChronoLocalDateTime<D>) toLocalDate().getChronology().localDateTime(endExclusive); if (unit instanceof ChronoUnit) { ChronoUnit f = (ChronoUnit) unit; if (f.isTimeBased()) { long amount = end.getLong(EPOCH_DAY) - date.getLong(EPOCH_DAY); switch (f) { case NANOS: amount = Jdk8Methods.safeMultiply(amount, NANOS_PER_DAY); break; case MICROS: amount = Jdk8Methods.safeMultiply(amount, MICROS_PER_DAY); break; case MILLIS: amount = Jdk8Methods.safeMultiply(amount, MILLIS_PER_DAY); break; case SECONDS: amount = Jdk8Methods.safeMultiply(amount, SECONDS_PER_DAY); break; case MINUTES: amount = Jdk8Methods.safeMultiply(amount, MINUTES_PER_DAY); break; case HOURS: amount = Jdk8Methods.safeMultiply(amount, HOURS_PER_DAY); break; case HALF_DAYS: amount = Jdk8Methods.safeMultiply(amount, 2); break; } return Jdk8Methods.safeAdd(amount, time.until(end.toLocalTime(), unit)); } ChronoLocalDate endDate = end.toLocalDate(); if (end.toLocalTime().isBefore(time)) { endDate = endDate.minus(1, ChronoUnit.DAYS); } return date.until(endDate, unit); } return unit.between(this, end); }