docs: public ZonedDateTime nextTimeAfter(ZonedDateTime afterTime, ZonedDateTime dateTimeBarrier) {
          ZonedDateTime nextTime = ZonedDateTime.from(afterTime).withNano(0).plusSeconds(1).withNano(0);
  
          while (true) { // day of week
              while (true) { // month
                  while (true) { // day of month
                      while (true) { // hour
                          while (true) { // minute
                              while (true) { // second
                                  if (secondField.matches(nextTime.getSecond())) {
                                      break;
                                  }
                                  nextTime = nextTime.plusSeconds(1).withNano(0);
                              }
                              if (minuteField.matches(nextTime.getMinute())) {
                                  break;
                              }
                              nextTime = nextTime.plusMinutes(1).withSecond(0).withNano(0);
                          }
                          if (hourField.matches(nextTime.getHour())) {
                              break;
                          }
                          nextTime = nextTime.plusHours(1).withMinute(0).withSecond(0).withNano(0);
                      }
                      if (dayOfMonthField.matches(nextTime.toLocalDate())) {
                          break;
                      }
                      nextTime = nextTime.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
                      checkIfDateTimeBarrierIsReached(nextTime, dateTimeBarrier);
                  }
                  if (monthField.matches(nextTime.getMonth().getValue())) {
                      break;
                  }
                  nextTime = nextTime.plusMonths(1).withDayOfMonth(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
                  checkIfDateTimeBarrierIsReached(nextTime, dateTimeBarrier);
              }
              if (dayOfWeekField.matches(nextTime.toLocalDate())) {
                  break;
              }
              nextTime = nextTime.plusDays(1).withHour(0).withMinute(0).withSecond(0).withNano(0);
              checkIfDateTimeBarrierIsReached(nextTime, dateTimeBarrier);
          }
  
          return nextTime;
      }