TimeZoneRule * RuleBasedTimeZone::findRuleInFinal(UDate date, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const { if (fFinalRules == NULL) { return NULL; } AnnualTimeZoneRule * fr0 = (AnnualTimeZoneRule *)fFinalRules->elementAt(0); AnnualTimeZoneRule * fr1 = (AnnualTimeZoneRule *)fFinalRules->elementAt(1); if (fr0 == NULL || fr1 == NULL) { return NULL; } UDate start0, start1; UDate base; int32_t localDelta; base = date; if (local) { localDelta = getLocalDelta(fr1->getRawOffset(), fr1->getDSTSavings(), fr0->getRawOffset(), fr0->getDSTSavings(), NonExistingTimeOpt, DuplicatedTimeOpt); base -= localDelta; } UBool avail0 = fr0->getPreviousStart(base, fr1->getRawOffset(), fr1->getDSTSavings(), TRUE, start0); base = date; if (local) { localDelta = getLocalDelta(fr0->getRawOffset(), fr0->getDSTSavings(), fr1->getRawOffset(), fr1->getDSTSavings(), NonExistingTimeOpt, DuplicatedTimeOpt); base -= localDelta; } UBool avail1 = fr1->getPreviousStart(base, fr0->getRawOffset(), fr0->getDSTSavings(), TRUE, start1); if (avail0 && (!avail1 || start0 > start1)) { return fr0; } else if (avail1) { return fr1; } return NULL; }
UDate RuleBasedTimeZone::getTransitionTime(Transition* transition, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const { UDate time = transition->time; if (local) { time += getLocalDelta(transition->from->getRawOffset(), transition->from->getDSTSavings(), transition->to->getRawOffset(), transition->to->getDSTSavings(), NonExistingTimeOpt, DuplicatedTimeOpt); } return time; }