rule.getMonth().getValue(), rule.createTransition(thisYear).getDateTimeBefore().get( weekOfMonth), rule.getDayOfWeek().getValue() % 7, rule.getLocalTime());
} else { long timeOfDaysMins = time.toSecondOfDay() / 60 + adjustDays * 24 * 60; appendZeroPad(buf, Jdk8Methods.floorDiv(timeOfDaysMins, 60)); buf.append(':'); appendZeroPad(buf, Jdk8Methods.floorMod(timeOfDaysMins, 60));
private static Object readInternal(byte type, DataInput in) throws IOException, ClassNotFoundException { switch (type) { case SZR: return StandardZoneRules.readExternal(in); case ZOT: return ZoneOffsetTransition.readExternal(in); case ZOTRULE: return ZoneOffsetTransitionRule.readExternal(in); default: throw new StreamCorruptedException("Unknown serialized type"); } }
int transitionRuleMonthValue = transitionRule.getMonth().getValue(); DayOfWeek transitionRuleDayOfWeek = transitionRule.getDayOfWeek(); LocalDateTime ldt = LocalDateTime.now(zoneId) .with(TemporalAdjusters.firstInMonth(transitionRuleDayOfWeek)) .withMonth(transitionRuleMonthValue) .with(transitionRule.getLocalTime()); Month month = ldt.getMonth(); }while((ldt = ldt.plus(org.threeten.bp.Period.ofWeeks(1))).getMonth() == month); Integer dayOfMonth = allDaysOfWeek.ceiling(transitionRule.getDayOfMonthIndicator()); if (dayOfMonth == null) { dayOfMonth = allDaysOfWeek.last(); TzOffsetFrom offsetFrom = new TzOffsetFrom(new UtcOffset(transitionRule.getOffsetBefore().getTotalSeconds() * 1000L)); TzOffsetTo offsetTo = new TzOffsetTo(new UtcOffset(transitionRule.getOffsetAfter().getTotalSeconds() * 1000L)); RRule rrule = new RRule(rruleText); Observance observance = (transitionRule.getOffsetAfter().getTotalSeconds() > rawTimeZoneOffsetInSeconds) ? new Daylight() : new Standard(); observance.getProperties().add(new DtStart(String.format(DATE_TIME_TPL, startDate.withMonth(transitionRule.getMonth().getValue()) .withDayOfMonth(transitionRule.getDayOfMonthIndicator()) .with(transitionRule.getDayOfWeek()))));
/** * Finds the appropriate transition array for the given year. * * @param year the year, not null * @return the transition array, not null */ private ZoneOffsetTransition[] findTransitionArray(int year) { Integer yearObj = year; // should use Year class, but this saves a class load ZoneOffsetTransition[] transArray = lastRulesCache.get(yearObj); if (transArray != null) { return transArray; } ZoneOffsetTransitionRule[] ruleArray = lastRules; transArray = new ZoneOffsetTransition[ruleArray.length]; for (int i = 0; i < ruleArray.length; i++) { transArray[i] = ruleArray[i].createTransition(year); } if (year < LAST_CACHED_YEAR) { lastRulesCache.putIfAbsent(yearObj, transArray); } return transArray; }
/** * Converts this to a transition rule. * * @param standardOffset the active standard offset, not null * @param savingsBeforeSecs the active savings before the transition in seconds * @return the transition, not null */ ZoneOffsetTransitionRule toTransitionRule(ZoneOffset standardOffset, int savingsBeforeSecs) { // optimize stored format if (dayOfMonthIndicator < 0) { if (month != Month.FEBRUARY) { dayOfMonthIndicator = month.maxLength() - 6; } } // build rule ZoneOffsetTransition trans = toTransition(standardOffset, savingsBeforeSecs); return new ZoneOffsetTransitionRule( month, dayOfMonthIndicator, dayOfWeek, time, adjustDays, timeDefinition, standardOffset, trans.getOffsetBefore(), trans.getOffsetAfter()); }
/** * Finds the appropriate transition array for the given year. * * @param year the year, not null * @return the transition array, not null */ private ZoneOffsetTransition[] findTransitionArray(int year) { Integer yearObj = year; // should use Year class, but this saves a class load ZoneOffsetTransition[] transArray = lastRulesCache.get(yearObj); if (transArray != null) { return transArray; } ZoneOffsetTransitionRule[] ruleArray = lastRules; transArray = new ZoneOffsetTransition[ruleArray.length]; for (int i = 0; i < ruleArray.length; i++) { transArray[i] = ruleArray[i].createTransition(year); } if (year < LAST_CACHED_YEAR) { lastRulesCache.putIfAbsent(yearObj, transArray); } return transArray; }
/** * Converts this to a transition rule. * * @param standardOffset the active standard offset, not null * @param savingsBeforeSecs the active savings before the transition in seconds * @return the transition, not null */ ZoneOffsetTransitionRule toTransitionRule(ZoneOffset standardOffset, int savingsBeforeSecs) { // optimize stored format if (dayOfMonthIndicator < 0) { if (month != Month.FEBRUARY) { dayOfMonthIndicator = month.maxLength() - 6; } } // build rule ZoneOffsetTransition trans = toTransition(standardOffset, savingsBeforeSecs); return new ZoneOffsetTransitionRule( month, dayOfMonthIndicator, dayOfWeek, time, adjustDays, timeDefinition, standardOffset, trans.getOffsetBefore(), trans.getOffsetAfter()); }
/** * Reads the state from the stream. * * @param in the input stream, not null * @return the created object, not null * @throws IOException if an error occurs */ static ZoneOffsetTransitionRule readExternal(DataInput in) throws IOException { int data = in.readInt(); Month month = Month.of(data >>> 28); int dom = ((data & (63 << 22)) >>> 22) - 32; int dowByte = (data & (7 << 19)) >>> 19; DayOfWeek dow = dowByte == 0 ? null : DayOfWeek.of(dowByte); int timeByte = (data & (31 << 14)) >>> 14; TimeDefinition defn = TimeDefinition.values()[(data & (3 << 12)) >>> 12]; int stdByte = (data & (255 << 4)) >>> 4; int beforeByte = (data & (3 << 2)) >>> 2; int afterByte = (data & 3); int timeOfDaysSecs = (timeByte == 31 ? in.readInt() : timeByte * 3600); ZoneOffset std = (stdByte == 255 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds((stdByte - 128) * 900)); ZoneOffset before = (beforeByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + beforeByte * 1800)); ZoneOffset after = (afterByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + afterByte * 1800)); // only bit of validation that we need to copy from public of() method if (dom < -28 || dom > 31 || dom == 0) { throw new IllegalArgumentException("Day of month indicator must be between -28 and 31 inclusive excluding zero"); } LocalTime time = LocalTime.ofSecondOfDay(Jdk8Methods.floorMod(timeOfDaysSecs, SECS_PER_DAY)); int adjustDays = Jdk8Methods.floorDiv(timeOfDaysSecs, SECS_PER_DAY); return new ZoneOffsetTransitionRule(month, dom, dow, time, adjustDays, defn, std, before, after); }
private static Object readInternal(byte type, DataInput in) throws IOException, ClassNotFoundException { switch (type) { case SZR: return StandardZoneRules.readExternal(in); case ZOT: return ZoneOffsetTransition.readExternal(in); case ZOTRULE: return ZoneOffsetTransitionRule.readExternal(in); default: throw new StreamCorruptedException("Unknown serialized type"); } }
} else { long timeOfDaysMins = time.toSecondOfDay() / 60 + adjustDays * 24 * 60; appendZeroPad(buf, Jdk8Methods.floorDiv(timeOfDaysMins, 60)); buf.append(':'); appendZeroPad(buf, Jdk8Methods.floorMod(timeOfDaysMins, 60));
/** * Reads the state from the stream. * * @param in the input stream, not null * @return the created object, not null * @throws IOException if an error occurs */ static ZoneOffsetTransitionRule readExternal(DataInput in) throws IOException { int data = in.readInt(); Month month = Month.of(data >>> 28); int dom = ((data & (63 << 22)) >>> 22) - 32; int dowByte = (data & (7 << 19)) >>> 19; DayOfWeek dow = dowByte == 0 ? null : DayOfWeek.of(dowByte); int timeByte = (data & (31 << 14)) >>> 14; TimeDefinition defn = TimeDefinition.values()[(data & (3 << 12)) >>> 12]; int stdByte = (data & (255 << 4)) >>> 4; int beforeByte = (data & (3 << 2)) >>> 2; int afterByte = (data & 3); int timeOfDaysSecs = (timeByte == 31 ? in.readInt() : timeByte * 3600); ZoneOffset std = (stdByte == 255 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds((stdByte - 128) * 900)); ZoneOffset before = (beforeByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + beforeByte * 1800)); ZoneOffset after = (afterByte == 3 ? ZoneOffset.ofTotalSeconds(in.readInt()) : ZoneOffset.ofTotalSeconds(std.getTotalSeconds() + afterByte * 1800)); // only bit of validation that we need to copy from public of() method if (dom < -28 || dom > 31 || dom == 0) { throw new IllegalArgumentException("Day of month indicator must be between -28 and 31 inclusive excluding zero"); } LocalTime time = LocalTime.ofSecondOfDay(Jdk8Methods.floorMod(timeOfDaysSecs, SECS_PER_DAY)); int adjustDays = Jdk8Methods.floorDiv(timeOfDaysSecs, SECS_PER_DAY); return new ZoneOffsetTransitionRule(month, dom, dow, time, adjustDays, defn, std, before, after); }
ZoneOffsetTransitionRule[] rules = new ZoneOffsetTransitionRule[ruleSize]; for (int i = 0; i < ruleSize; i++) { rules[i] = ZoneOffsetTransitionRule.readExternal(in);
throw new IllegalArgumentException("Time must be midnight when end of day flag is true"); return new ZoneOffsetTransitionRule(month, dayOfMonthIndicator, dayOfWeek, time, timeEndOfDay ? 1 : 0, timeDefnition, standardOffset, offsetBefore, offsetAfter);
ZoneOffsetTransitionRule[] rules = new ZoneOffsetTransitionRule[ruleSize]; for (int i = 0; i < ruleSize; i++) { rules[i] = ZoneOffsetTransitionRule.readExternal(in);
throw new IllegalArgumentException("Time must be midnight when end of day flag is true"); return new ZoneOffsetTransitionRule(month, dayOfMonthIndicator, dayOfWeek, time, timeEndOfDay ? 1 : 0, timeDefnition, standardOffset, offsetBefore, offsetAfter);