docs: public void advanceTo(DateValue dateUtc) {
          // Don't throw away a future pending date since the iterators will not
          // generate it again.
          if (this.pendingUtc_ != null && dateUtc.compareTo(this.pendingUtc_) <= 0) {
              return;
          }
  
          DateValue dateLocal = TimeUtils.fromUtc(dateUtc, tzid_);
          // Short-circuit if we're already past dateUtc.
          if (dateLocal.compareTo(this.builder_.toDate()) <= 0) {
              return;
          }
          this.pendingUtc_ = null;
  
          try {
              if (this.canShortcutAdvance_) {
                  // skip years before date.year
                  if (this.builder_.year < dateLocal.year()) {
                      do {
                          if (!this.yearGenerator_.generate(this.builder_)) {
                              this.done_ = true;
                              return;
                          }
                      } while (this.builder_.year < dateLocal.year());
                      while (!this.monthGenerator_.generate(this.builder_)) {
                          if (!this.yearGenerator_.generate(this.builder_)) {
                              this.done_ = true;
                              return;
                          }
                      }
                  }
                  // skip months before date.year/date.month
                  while (this.builder_.year == dateLocal.year()
                          && this.builder_.month < dateLocal.month()) {
                      while (!this.monthGenerator_.generate(this.builder_)) {
                          // if there are more years available fetch one
                          if (!this.yearGenerator_.generate(this.builder_)) {
                              // otherwise the recurrence is exhausted
                              this.done_ = true;
                              return;
                          }
                      }
                  }
              }
  
              // consume any remaining instances
              while (!this.done_) {
                  DateValue dUtc = this.generateInstance();
                  if (null == dUtc) {
                      this.done_ = true;
                  } else {
                      if (!this.condition_.apply(dUtc)) {
                          this.done_ = true;
                      } else if (dUtc.compareTo(dateUtc) >= 0) {
                          this.pendingUtc_ = dUtc;
                          break;
                      }
                  }
              }
          } catch (Generator.IteratorShortCircuitingException ex) {
              this.done_ = true;
          }
      }