* @return the zoned date-time formed from this date and the earliest valid time for the zone, not null
   */
  public ZonedDateTime atStartOfDay(ZoneId zoneId) {

    Jdk7Methods.Objects_requireNonNull(zoneId, "zoneId");
    // need to handle case where there is a gap from 11:30 to 00:30
    // standard ZDT factory would result in 01:00 rather than 00:30
    LocalDateTime ldt = atTime(LocalTime.MIDNIGHT);
    if (zoneId instanceof ZoneOffset == false) {
      ZoneRules rules = zoneId.getRules();
      ZoneOffsetTransition trans = rules.getTransition(ldt);
      if (trans != null && trans.isGap()) {
        ldt = trans.getDateTimeAfter();
      }
    }
    return ZonedDateTime.of(ldt, zoneId);
  }