private long monthsUntil(LocalDate end) {

    long packed1 = getEpochMonth() * 32L + getDayOfMonth(); // no overflow
    long packed2 = end.getEpochMonth() * 32L + end.getDayOfMonth(); // no overflow
    return (packed2 - packed1) / 32;
  }