@Override
 public Time plus(Integer hour, Integer minute, Integer second, Integer nanoseconds) {
   DateTimeInterval interval = new DateTimeInterval(this);
   interval.plus(hour, minute, second, nanoseconds);
   return GregorianDateTime.newTime(
       interval.getResultHour(),
       interval.getResultMinute(),
       interval.getResultSecond(),
       interval.getResultNanoseconds());
 }
 @Override
 public Time minus(Time that) {
   DateTimeInterval interval = new DateTimeInterval(this);
   interval.minus(that.getHour(), that.getMinute(), that.getSecond(), that.getNanoseconds());
   return GregorianDateTime.newTime(
       interval.getResultHour(),
       interval.getResultMinute(),
       interval.getResultSecond(),
       interval.getResultNanoseconds());
 }
  @Override
  public Time changeTimeZone(TimeZone fromTimeZone, TimeZone toTimeZone) {
    Calendar fromDate = new GregorianCalendar(fromTimeZone);
    fromDate.set(Calendar.HOUR_OF_DAY, getHour());
    fromDate.set(Calendar.MINUTE, getMinute());
    // other items zeroed out here, since they don't matter for time zone calculations
    fromDate.set(Calendar.SECOND, 0);
    fromDate.set(Calendar.MILLISECOND, 0);

    // millisecond precision is OK here, since the seconds/nanoseconds are not part of the calc
    Calendar toDate = new GregorianCalendar(toTimeZone);
    toDate.setTimeInMillis(fromDate.getTimeInMillis());

    return GregorianDateTime.newTime(
        toDate.get(Calendar.HOUR_OF_DAY), getMinute(), getSecond(), getNanoseconds());
  }
 @Override
 public boolean isInThePast(TimeZone timeZone) {
   return GregorianDateTime.nowTimeOnly(timeZone).compareTo(this) > 0;
 }