### Question:
NormalSwaptionExpirySimpleMoneynessVolatilities implements NormalSwaptionVolatilities, ImmutableBean, Serializable { @Override public double relativeTime(ZonedDateTime dateTime) { ArgChecker.notNull(dateTime, "dateTime"); LocalDate valuationDate = valuationDateTime.toLocalDate(); LocalDate date = dateTime.toLocalDate(); return dayCount.relativeYearFraction(valuationDate, date); } @ImmutableConstructor private  NormalSwaptionExpirySimpleMoneynessVolatilities(
      FixedIborSwapConvention convention,
      ZonedDateTime valuationDateTime,
      Surface surface); static NormalSwaptionExpirySimpleMoneynessVolatilities of(
      FixedIborSwapConvention convention,
      ZonedDateTime valuationDateTime,
      Surface surface); @Override SwaptionVolatilitiesName getName(); @Override Optional<T> findData(MarketDataName<T> name); @Override int getParameterCount(); @Override double getParameter(int parameterIndex); @Override ParameterMetadata getParameterMetadata(int parameterIndex); @Override OptionalInt findParameterIndex(ParameterMetadata metadata); @Override NormalSwaptionExpirySimpleMoneynessVolatilities withParameter(int parameterIndex, double newValue); @Override NormalSwaptionExpirySimpleMoneynessVolatilities withPerturbation(ParameterPerturbation perturbation); @Override double volatility(double expiry, double tenor, double strike, double forwardRate); @Override CurrencyParameterSensitivities parameterSensitivity(PointSensitivities pointSensitivities); @Override double price(double expiry, double tenor, PutCall putCall, double strike, double forward, double volatility); @Override double priceDelta(double expiry, double tenor, PutCall putCall, double strike, double forward, double volatility); @Override double priceGamma(double expiry, double tenor, PutCall putCall, double strike, double forward, double volatility); @Override double priceTheta(double expiry, double tenor, PutCall putCall, double strike, double forward, double volatility); @Override double priceVega(double expiry, double tenor, PutCall putCall, double strike, double forward, double volatility); @Override double relativeTime(ZonedDateTime dateTime); @Override double tenor(LocalDate startDate, LocalDate endDate); static NormalSwaptionExpirySimpleMoneynessVolatilities.Meta meta(); @Override NormalSwaptionExpirySimpleMoneynessVolatilities.Meta metaBean(); @Override FixedIborSwapConvention getConvention(); @Override ZonedDateTime getValuationDateTime(); Surface getSurface(); @Override boolean equals(Object obj); @Override int hashCode(); @Override String toString();  }### Answer:
@Test public void test_relativeTime() { double test1 = VOLS.relativeTime(VAL_DATE_TIME); assertThat(test1).isEqualTo(0d); double test2 = VOLS.relativeTime(date(2018, 2, 17).atStartOfDay(LONDON_ZONE)); double test3 = VOLS.relativeTime(date(2012, 2, 17).atStartOfDay(LONDON_ZONE)); assertThat(test2).isEqualTo(-test3); }