use of net.fortuna.ical4j.model.component.Daylight in project zm-mailbox by Zimbra.
the class TimeZoneDefinition method getTimeZone.
/**
*
* @return the appropriate iCal4j TimeZone for this TimeZoneDefinition
*/
public TimeZone getTimeZone() {
if (theZone != null) {
return theZone;
}
if (effectiveRule == null) {
theZone = new TimeZone(0, TimeZones.UTC_ID);
return theZone;
}
if (!effectiveRule.hasDaylightSaving()) {
theZone = new TimeZone(effectiveRule.getStandardUtcOffsetMillis(), getTimezoneName());
return theZone;
}
UtcOffset stdOffset = effectiveRule.getStandardUtcOffset();
UtcOffset dlOffset = effectiveRule.getDaylightUtcOffset();
PropertyList vtzProps = new PropertyList();
TzId myTzid = new TzId(getTimezoneName());
vtzProps.add(myTzid);
VTimeZone vtz = new VTimeZone(vtzProps);
Standard stdComp = new Standard();
stdComp.getProperties().add(effectiveRule.getStandardDtStart());
stdComp.getProperties().add(effectiveRule.icalStandardRRule());
TzOffsetFrom offsetFrom = new TzOffsetFrom(dlOffset);
TzOffsetTo offsetTo = new TzOffsetTo(stdOffset);
stdComp.getProperties().add(offsetFrom);
stdComp.getProperties().add(offsetTo);
Daylight dayComp = new Daylight();
dayComp.getProperties().add(effectiveRule.getDaylightDtStart());
dayComp.getProperties().add(effectiveRule.icalDaylightRRule());
offsetFrom = new TzOffsetFrom(stdOffset);
offsetTo = new TzOffsetTo(dlOffset);
dayComp.getProperties().add(offsetFrom);
dayComp.getProperties().add(offsetTo);
vtz.getObservances().add(stdComp);
vtz.getObservances().add(dayComp);
try {
vtz.validate(true);
theZone = new TimeZone(vtz);
} catch (ValidationException e) {
if (sLog.isDebugEnabled()) {
sLog.debug("Problem with property %s - will default to UTC" + this.mpi.toString(), e);
}
theZone = new TimeZone(0, TimeZones.UTC_ID);
}
theZone = new TimeZone(vtz);
return theZone;
}
use of net.fortuna.ical4j.model.component.Daylight in project zm-mailbox by Zimbra.
the class ZoneInfo2iCalendar method toObservanceComp.
private static Observance toObservanceComp(int hintYear, RuleLine rline, boolean isStandard, Time standardOffset, Time daylightOffset, String tznameFormat) {
PropertyList props = new PropertyList();
String tzname = getObservanceName(tznameFormat, rline);
if (tzname != null) {
props.add(new TzName(tzname));
}
Time at = rline.getAt();
Time onset;
switch(at.getType()) {
case STANDARD_TIME:
if (isStandard) {
// We're moving from daylight time to standard time. In iCalendar we want hh:mm:ss in
// wall clock in the pre-transition time, so it's daylight time.
// daylight = utc + daylight offset = (standard - standard offset) + daylight offset
onset = addTimes(subtractTimes(at, standardOffset), daylightOffset);
} else {
// We're moving from standard time to daylight time. In iCalendar we want hh:mm:ss in
// wall clock in the pre-transition time, so it's standard time. at is already in
// standard time.
onset = at;
}
break;
case UTC_TIME:
if (isStandard) {
// We're moving from daylight time to standard time. In iCalendar we want hh:mm:ss in
// wall clock in the pre-transition time, so it's daylight time.
// daylight = utc + daylightOffset.
onset = addTimes(at, daylightOffset);
} else {
// We're moving from standard time to daylight time. In iCalendar we want hh:mm:ss in
// wall clock in the pre-transition time, so it's standard time.
// standard = utc + standard offset.
onset = addTimes(at, standardOffset);
}
break;
default:
// WALL_TIME
// at is already in the iCalendar style.
onset = at;
break;
}
int hh = onset.getHour();
int mm = onset.getMinute();
int ss = onset.getSecond();
if (hh >= 24) {
// Hour should be between 0 and 23, but sometimes we can get 24:00:00 from the zoneinfo source.
// Since hour part in iCalendar only allows 0-23, let's approximate any time with hour >= 24 to
// 23:59:59.
hh = 23;
mm = 59;
ss = 59;
}
// YYYYMMDD fixed to 16010101 (MS Outlook style)
props.add(getDtStart(String.format("16010101T%02d%02d%02d", hh, mm, ss)));
Time toOffset, fromOffset;
if (isStandard) {
toOffset = standardOffset;
fromOffset = daylightOffset;
} else {
toOffset = daylightOffset;
fromOffset = standardOffset;
}
props.add(new TzOffsetTo(new UtcOffset(getUtcOffset(toOffset))));
props.add(new TzOffsetFrom(new UtcOffset(getUtcOffset(fromOffset))));
int month = rline.getIn();
StringBuilder rruleVal = new StringBuilder();
rruleVal.append("FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=").append(month).append(";");
rruleVal.append(dayToICalRRulePart(hintYear, month, rline.getOn()));
try {
RRule rrule = new RRule(new ParameterList(), rruleVal.toString());
props.add(rrule);
} catch (ParseException e) {
}
if (isStandard) {
return new Standard(props);
} else {
return new Daylight(props);
}
}
Aggregations