/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.convention.daycount; import org.threeten.bp.LocalDate; import org.threeten.bp.temporal.JulianFields; /** * The 'Actual/Actual ISDA' day count. */ public class ActualActualISDA extends ActualTypeDayCount { /** Serialization version. */ private static final long serialVersionUID = 1L; @Override public double getDayCountFraction(final LocalDate firstDate, final LocalDate secondDate) { testDates(firstDate, secondDate); final int y1 = firstDate.getYear(); final int y2 = secondDate.getYear(); if (y1 == y2) { final double basis = firstDate.isLeapYear() ? 366 : 365; final long firstJulian = firstDate.getLong(JulianFields.MODIFIED_JULIAN_DAY); final long secondJulian = secondDate.getLong(JulianFields.MODIFIED_JULIAN_DAY); return (secondJulian - firstJulian) / basis; } final long firstNewYearJulian = LocalDate.of(y1 + 1, 1, 1).getLong(JulianFields.MODIFIED_JULIAN_DAY); final long firstJulian = firstDate.getLong(JulianFields.MODIFIED_JULIAN_DAY); final long secondNewYearJulian = LocalDate.of(y2, 1, 1).getLong(JulianFields.MODIFIED_JULIAN_DAY); final long secondJulian = secondDate.getLong(JulianFields.MODIFIED_JULIAN_DAY); final double firstBasis = firstDate.isLeapYear() ? 366 : 365; final double secondBasis = secondDate.isLeapYear() ? 366 : 365; return (firstNewYearJulian - firstJulian) / firstBasis + (secondJulian - secondNewYearJulian) / secondBasis + (y2 - y1 - 1); } @Override public double getAccruedInterest(final LocalDate previousCouponDate, final LocalDate date, final LocalDate nextCouponDate, final double coupon, final double paymentsPerYear) { return getDayCountFraction(previousCouponDate, date) * coupon; } @Override public String getName() { return "Actual/Actual ISDA"; } }