code: @Override
      public TimeZoneTransition getPreviousTransition(long base, boolean inclusive) {
          complete();
          if (historicTransitions == null) {
              return null;
          }
          TimeZoneTransition result;
          TimeZoneTransition tzt = historicTransitions.get(0);
          long tt = tzt.getTime();
          if (inclusive && tt == base) {
              result = tzt;
          } else if (tt >= base) {
              return null;
          } else {
              int idx = historicTransitions.size() - 1;        
              tzt = historicTransitions.get(idx);
              tt = tzt.getTime();
              if (inclusive && tt == base) {
                  result = tzt;
              } else if (tt < base) {
                  if (finalRules != null) {
                      // Find a transion time with finalRules
                      Date start0 = finalRules[0].getPreviousStart(base,
                              finalRules[1].getRawOffset(), finalRules[1].getDSTSavings(), inclusive);
                      Date start1 = finalRules[1].getPreviousStart(base,
                              finalRules[0].getRawOffset(), finalRules[0].getDSTSavings(), inclusive);
  
                      if (start1.before(start0)) {
                          tzt = new TimeZoneTransition(start0.getTime(), finalRules[1], finalRules[0]);
                      } else {
                          tzt = new TimeZoneTransition(start1.getTime(), finalRules[0], finalRules[1]);
                      }
                  }
                  result = tzt;
              } else {
                  // Find a transition within the historic transitions
                  idx--;
                  while (idx >= 0) {
                      tzt = historicTransitions.get(idx);
                      tt = tzt.getTime();
                      if (tt < base || (inclusive && tt == base)) {
                          break;
                      }
                      idx--;
                  }
                  result = tzt;                
              }
          }
          // For now, this implementation ignore transitions with only zone name changes.
          TimeZoneRule from = result.getFrom();
          TimeZoneRule to = result.getTo();
          if (from.getRawOffset() == to.getRawOffset()
                  && from.getDSTSavings() == to.getDSTSavings()) {
              // No offset changes.  Try previous one
              result = getPreviousTransition(result.getTime(), false /* always exclusive */);
          }
          return result;
      }
docs: {@inheritDoc}