/** * Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.strata.basics.date; import static java.time.DayOfWeek.MONDAY; import static java.time.DayOfWeek.SUNDAY; import java.time.LocalDate; import com.opengamma.strata.collect.ArgChecker; /** * Standard business day convention implementations. * <p> * See {@link BusinessDayConventions} for the description of each. */ enum StandardBusinessDayConventions implements BusinessDayConvention { // make no adjustment NO_ADJUST("NoAdjust") { @Override public LocalDate adjust(LocalDate date, HolidayCalendar calendar) { return ArgChecker.notNull(date, "date"); } }, // next business day FOLLOWING("Following") { @Override public LocalDate adjust(LocalDate date, HolidayCalendar calendar) { return calendar.nextOrSame(date); } }, // next business day unless over a month end MODIFIED_FOLLOWING("ModifiedFollowing") { @Override public LocalDate adjust(LocalDate date, HolidayCalendar calendar) { return calendar.nextSameOrLastInMonth(date); } }, // next business day unless over a month end or mid MODIFIED_FOLLOWING_BI_MONTHLY("ModifiedFollowingBiMonthly") { @Override public LocalDate adjust(LocalDate date, HolidayCalendar calendar) { LocalDate adjusted = calendar.nextOrSame(date); if (adjusted.getMonthValue() != date.getMonthValue() || (adjusted.getDayOfMonth() > 15 && date.getDayOfMonth() <= 15)) { adjusted = calendar.previous(date); } return adjusted; } }, // previous business day PRECEDING("Preceding") { @Override public LocalDate adjust(LocalDate date, HolidayCalendar calendar) { return calendar.previousOrSame(date); } }, // previous business day unless over a month end MODIFIED_PRECEDING("ModifiedPreceding") { @Override public LocalDate adjust(LocalDate date, HolidayCalendar calendar) { LocalDate adjusted = calendar.previousOrSame(date); if (adjusted.getMonth() != date.getMonth()) { adjusted = calendar.next(date); } return adjusted; } }, // next business day if Sun/Mon, otherwise previous NEAREST("Nearest") { @Override public LocalDate adjust(LocalDate date, HolidayCalendar calendar) { if (calendar.isBusinessDay(date)) { return date; } if (date.getDayOfWeek() == SUNDAY || date.getDayOfWeek() == MONDAY) { return calendar.next(date); } else { return calendar.previous(date); } } }; // name private final String name; // create private StandardBusinessDayConventions(String name) { this.name = name; } @Override public String getName() { return name; } @Override public String toString() { return name; } }