/** * {@inheritDoc} */ public void validate(VTimeZone target) throws ValidationException { for (final Observance observance : target.getObservances()) { Arrays.asList(DTSTART, TZOFFSETFROM, TZOFFSETTO).forEach( property -> PropertyValidator.getInstance().assertOne(property, observance.getProperties())); PropertyValidator.getInstance().assertOneOrLess(TZNAME, observance.getProperties()); } } }
/** * {@inheritDoc} */ public void validate(VTimeZone target) throws ValidationException { for (final Observance observance : target.getObservances()) { Arrays.asList(DTSTART, TZOFFSETFROM, TZOFFSETTO).forEach( property -> PropertyValidator.getInstance().assertOne(property, observance.getProperties())); PropertyValidator.getInstance().assertOneOrLess(TZNAME, observance.getProperties()); } } }
/** * {@inheritDoc} */ public void validate(VTimeZone target) throws ValidationException { for (final Observance observance : target.getObservances()) { PropertyValidator.getInstance().assertOne(Property.DTSTART, observance.getProperties()); PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, observance.getProperties()); PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, observance.getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.TZNAME, observance.getProperties()); } } }
/** * {@inheritDoc} */ public void validate() throws ValidationException { for (final Iterator i = getObservances().iterator(); i.hasNext();) { final Observance observance = (Observance) i.next(); PropertyValidator.getInstance().assertOne(Property.DTSTART, observance.getProperties()); PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, observance.getProperties()); PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, observance.getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.COMMENT, observance.getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.TZNAME, observance.getProperties()); } } }
/** * {@inheritDoc} */ public void validate(VTimeZone target) throws ValidationException { for (final Observance observance : target.getObservances()) { PropertyValidator.getInstance().assertOne(Property.DTSTART, observance.getProperties()); PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, observance.getProperties()); PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, observance.getProperties()); PropertyValidator.getInstance().assertOneOrLess(Property.TZNAME, observance.getProperties()); } } }
/** * {@inheritDoc} */ public final void validate(final boolean recurse) throws ValidationException { // From "4.8.3.3 Time Zone Offset From": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, getProperties()); // From "4.8.3.4 Time Zone Offset To": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, getProperties()); /* * ; the following are each REQUIRED, ; but MUST NOT occur more than once dtstart / tzoffsetto / tzoffsetfrom / */ PropertyValidator.getInstance().assertOne(Property.DTSTART, getProperties()); /* * ; the following are optional, ; and MAY occur more than once comment / rdate / rrule / tzname / x-prop */ if (recurse) { validateProperties(); } }
/** * {@inheritDoc} */ public final void validate(final boolean recurse) throws ValidationException { // From "4.8.3.3 Time Zone Offset From": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, getProperties()); // From "4.8.3.4 Time Zone Offset To": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, getProperties()); /* * ; the following are each REQUIRED, ; but MUST NOT occur more than once dtstart / tzoffsetto / tzoffsetfrom / */ PropertyValidator.getInstance().assertOne(Property.DTSTART, getProperties()); /* * ; the following are optional, ; and MAY occur more than once comment / rdate / rrule / tzname / x-prop */ if (recurse) { validateProperties(); } }
/** * {@inheritDoc} */ public final void validate(final boolean recurse) throws ValidationException { // From "4.8.3.3 Time Zone Offset From": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, getProperties()); // From "4.8.3.4 Time Zone Offset To": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, getProperties()); /* * ; the following are each REQUIRED, ; but MUST NOT occur more than once dtstart / tzoffsetto / tzoffsetfrom / */ PropertyValidator.getInstance().assertOne(Property.DTSTART, getProperties()); /* * ; the following are optional, ; and MAY occur more than once comment / rdate / rrule / tzname / x-prop */ if (recurse) { validateProperties(); } }
/** * {@inheritDoc} */ public final void validate(final boolean recurse) throws ValidationException { // From "4.8.3.3 Time Zone Offset From": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, getProperties()); // From "4.8.3.4 Time Zone Offset To": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, getProperties()); /* * ; the following are each REQUIRED, ; but MUST NOT occur more than once dtstart / tzoffsetto / tzoffsetfrom / */ PropertyValidator.getInstance().assertOne(Property.DTSTART, getProperties()); /* * ; the following are optional, ; and MAY occur more than once comment / rdate / rrule / tzname / x-prop */ if (recurse) { validateProperties(); } }
/** * {@inheritDoc} */ public final void validate(final boolean recurse) throws ValidationException { // From "4.8.3.3 Time Zone Offset From": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETFROM, getProperties()); // From "4.8.3.4 Time Zone Offset To": // Conformance: This property MUST be specified in a "VTIMEZONE" // calendar component. PropertyValidator.getInstance().assertOne(Property.TZOFFSETTO, getProperties()); /* * ; the following are each REQUIRED, ; but MUST NOT occur more than once dtstart / tzoffsetto / tzoffsetfrom / */ PropertyValidator.getInstance().assertOne(Property.DTSTART, getProperties()); /* * ; the following are optional, ; and MAY occur more than once comment / rdate / rrule / tzname / x-prop */ if (recurse) { validateProperties(); } }
private static void addTransitions(ZoneId zoneId, VTimeZone result, int rawTimeZoneOffsetInSeconds) throws ParseException { Map<ZoneOffsetKey, Set<ZoneOffsetTransition>> zoneTransitionsByOffsets = new HashMap<ZoneOffsetKey, Set<ZoneOffsetTransition>>(); for (ZoneOffsetTransition zoneTransitionRule : zoneId.getRules().getTransitions()) { ZoneOffsetKey offfsetKey = ZoneOffsetKey.of(zoneTransitionRule.getOffsetBefore(), zoneTransitionRule.getOffsetAfter()); Set<ZoneOffsetTransition> transitionRulesForOffset = zoneTransitionsByOffsets.computeIfAbsent(offfsetKey, k -> new HashSet<ZoneOffsetTransition>(1)); transitionRulesForOffset.add(zoneTransitionRule); } for (Map.Entry<ZoneOffsetKey, Set<ZoneOffsetTransition>> e : zoneTransitionsByOffsets.entrySet()) { Observance observance = (e.getKey().offsetAfter.getTotalSeconds() > rawTimeZoneOffsetInSeconds) ? new Daylight() : new Standard(); LocalDateTime start = Collections.min(e.getValue()).getDateTimeBefore(); DtStart dtStart = new DtStart(start.format(DateTimeFormatter.ofPattern(DATE_TIME_TPL))); TzOffsetFrom offsetFrom = new TzOffsetFrom(e.getKey().offsetBefore); TzOffsetTo offsetTo = new TzOffsetTo(e.getKey().offsetAfter); observance.getProperties().add(dtStart); observance.getProperties().add(offsetFrom); observance.getProperties().add(offsetTo); for (ZoneOffsetTransition transition : e.getValue()) { RDate rDate = new RDate(new ParameterList(), transition.getDateTimeBefore().format(DateTimeFormatter.ofPattern(DATE_TIME_TPL))); observance.getProperties().add(rDate); } result.getObservances().add(observance); } }
private static void addTransitions(ZoneId zoneId, VTimeZone result, int rawTimeZoneOffsetInSeconds) throws ParseException { Map<ZoneOffsetKey, Set<ZoneOffsetTransition>> zoneTransitionsByOffsets = new HashMap<ZoneOffsetKey, Set<ZoneOffsetTransition>>(); for (ZoneOffsetTransition zoneTransitionRule : zoneId.getRules().getTransitions()) { ZoneOffsetKey offfsetKey = ZoneOffsetKey.of(zoneTransitionRule.getOffsetBefore(), zoneTransitionRule.getOffsetAfter()); Set<ZoneOffsetTransition> transitionRulesForOffset = zoneTransitionsByOffsets.computeIfAbsent(offfsetKey, k -> new HashSet<ZoneOffsetTransition>(1)); transitionRulesForOffset.add(zoneTransitionRule); } for (Map.Entry<ZoneOffsetKey, Set<ZoneOffsetTransition>> e : zoneTransitionsByOffsets.entrySet()) { Observance observance = (e.getKey().offsetAfter.getTotalSeconds() > rawTimeZoneOffsetInSeconds) ? new Daylight() : new Standard(); LocalDateTime start = Collections.min(e.getValue()).getDateTimeBefore(); DtStart dtStart = new DtStart(start.format(DateTimeFormatter.ofPattern(DATE_TIME_TPL))); TzOffsetFrom offsetFrom = new TzOffsetFrom(e.getKey().offsetBefore); TzOffsetTo offsetTo = new TzOffsetTo(e.getKey().offsetAfter); observance.getProperties().add(dtStart); observance.getProperties().add(offsetFrom); observance.getProperties().add(offsetTo); for (ZoneOffsetTransition transition : e.getValue()) { RDate rDate = new RDate(new ParameterList(), transition.getDateTimeBefore().format(DateTimeFormatter.ofPattern(DATE_TIME_TPL))); observance.getProperties().add(rDate); } result.getObservances().add(observance); } }
TzOffsetTo offsetTo = new TzOffsetTo(new UtcOffset(e.getKey().offsetAfter.getTotalSeconds() * 1000L)); observance.getProperties().add(dtStart); observance.getProperties().add(offsetFrom); observance.getProperties().add(offsetTo); observance.getProperties().add(rDate);
protected void setUp() throws Exception { observance = new Standard(); observance.getProperties().add(new DtStart("16010101T030000")); observance.getProperties().add(new TzOffsetFrom("+0200")); observance.getProperties().add(new TzOffsetTo("+0100")); observance.getProperties().add(new RRule("FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU")); }
/** * ICU4J generates VTIMEZONE RRULEs with floating UNTIL, which results * in a bad VTIMEZONE because the UNTIL is converted to UTC, which will * be different depending on the default timezone of the server. So * to fix this, always add a day to UNTIL to make sure the RRULE * doesn't fall short. This should work for most timezones as timezones * don't usually change from day to day. Hopefully this is fixed in * an icu4j update. * @param vtz */ protected static void fixIcuVTimeZone(VTimeZone vtz) { for(Iterator<Observance> obIt = vtz.getObservances().iterator();obIt.hasNext();) { PropertyList<RRule> rruleList= obIt.next().getProperties(Property.RRULE); for(RRule rrule: rruleList) { Recur recur = rrule.getRecur(); if(recur.getUntil()!=null) { recur.getUntil().setTime(recur.getUntil().getTime() + ONE_DAY); } } } }
/** * ICU4J generates VTIMEZONE RRULEs with floating UNTIL, which results * in a bad VTIMEZONE because the UNTIL is converted to UTC, which will * be different depending on the default timezone of the server. So * to fix this, always add a day to UNTIL to make sure the RRULE * doesn't fall short. This should work for most timezones as timezones * don't usually change from day to day. Hopefully this is fixed in * an icu4j update. * @param vtz */ protected static void fixIcuVTimeZone(VTimeZone vtz) { for(Iterator<Observance> obIt = vtz.getObservances().iterator();obIt.hasNext();) { PropertyList<RRule> rruleList= obIt.next().getProperties(Property.RRULE); for(RRule rrule: rruleList) { Recur recur = rrule.getRecur(); if(recur.getUntil()!=null) { recur.getUntil().setTime(recur.getUntil().getTime() + ONE_DAY); } } } }
observance.getProperties().add(offsetFrom); observance.getProperties().add(offsetTo); observance.getProperties().add(rrule); observance.getProperties().add(new DtStart(startDate.withMonth(transitionRule.getMonth().getValue()) .withDayOfMonth(transitionRule.getDayOfMonthIndicator()) .with(transitionRule.getDayOfWeek()).format(DateTimeFormatter.ofPattern(DATE_TIME_TPL))));
observance.getProperties().add(offsetFrom); observance.getProperties().add(offsetTo); observance.getProperties().add(rrule); observance.getProperties().add(new DtStart(startDate.withMonth(transitionRule.getMonth().getValue()) .withDayOfMonth(transitionRule.getDayOfMonthIndicator()) .with(transitionRule.getDayOfWeek()).format(DateTimeFormatter.ofPattern(DATE_TIME_TPL))));
final List<RDate> rdates = getProperties(Property.RDATE); for (RDate rdate : rdates) { for (final Date rdateDate : rdate.getDates()) { final List<RRule> rrules = getProperties(Property.RRULE); for (RRule rrule : rrules) {
observance.getProperties().add(offsetFrom); observance.getProperties().add(offsetTo); observance.getProperties().add(rrule); observance.getProperties().add(new DtStart(String.format(DATE_TIME_TPL, startDate.withMonth(transitionRule.getMonth().getValue()) .withDayOfMonth(transitionRule.getDayOfMonthIndicator()) .with(transitionRule.getDayOfWeek()))));