package net.tradelib.core;
import java.sql.SQLException;
import java.time.DateTimeException;
import java.time.DayOfWeek;
import java.time.LocalDate;
public class Calendar {
/**
* @brief Get a LocalDate which identifies the week.
*
* @param ld The input date
* @param anchor The day of the week which identifies the week. For example,
* if anchor is MONDAY, the week's unique date is the Monday's
* date.
*
* @return A date which is the same for all days of the week.
*
* @throws Exception
*/
public static LocalDate toWeek(LocalDate ld, DayOfWeek anchor) throws Exception {
DayOfWeek dow = ld.getDayOfWeek();
LocalDate result = null;
switch(dow) {
case MONDAY:
switch(anchor) {
case MONDAY: result = ld; break;
case TUESDAY: result = ld.plusDays(1); break;
case WEDNESDAY: result = ld.plusDays(2); break;
case THURSDAY: result = ld.plusDays(3); break;
case FRIDAY: result = ld.plusDays(4); break;
case SATURDAY: result = ld.plusDays(5); break;
case SUNDAY: result = ld.plusDays(6); break;
}
break;
case TUESDAY:
switch(anchor) {
case MONDAY: result = ld.minusDays(1); break;
case TUESDAY: result = ld; break;
case WEDNESDAY: result = ld.plusDays(1); break;
case THURSDAY: result = ld.plusDays(2); break;
case FRIDAY: result = ld.plusDays(3); break;
case SATURDAY: result = ld.plusDays(4); break;
case SUNDAY: result = ld.plusDays(5); break;
}
break;
case WEDNESDAY:
switch(anchor) {
case MONDAY: result = ld.minusDays(2); break;
case TUESDAY: result = ld.minusDays(1); break;
case WEDNESDAY: result = ld; break;
case THURSDAY: result = ld.plusDays(1); break;
case FRIDAY: result = ld.plusDays(2); break;
case SATURDAY: result = ld.plusDays(3); break;
case SUNDAY: result = ld.plusDays(4); break;
}
break;
case THURSDAY:
switch(anchor) {
case MONDAY: result = ld.minusDays(3); break;
case TUESDAY: result = ld.minusDays(2); break;
case WEDNESDAY: result = ld.minusDays(1); break;
case THURSDAY: result = ld; break;
case FRIDAY: result = ld.plusDays(1); break;
case SATURDAY: result = ld.plusDays(2); break;
case SUNDAY: result = ld.plusDays(3); break;
}
break;
case FRIDAY:
switch(anchor) {
case MONDAY: result = ld.minusDays(4); break;
case TUESDAY: result = ld.minusDays(3); break;
case WEDNESDAY: result = ld.minusDays(2); break;
case THURSDAY: result = ld.minusDays(1); break;
case FRIDAY: result = ld; break;
case SATURDAY: result = ld.plusDays(1); break;
case SUNDAY: result = ld.plusDays(2); break;
}
break;
case SATURDAY:
switch(anchor) {
case MONDAY: result = ld.minusDays(5); break;
case TUESDAY: result = ld.minusDays(4); break;
case WEDNESDAY: result = ld.minusDays(3); break;
case THURSDAY: result = ld.minusDays(2); break;
case FRIDAY: result = ld.minusDays(1); break;
case SATURDAY: result = ld; break;
case SUNDAY: result = ld.plusDays(1); break;
}
break;
case SUNDAY:
switch(anchor) {
case MONDAY: result = ld.minusDays(6); break;
case TUESDAY: result = ld.minusDays(5); break;
case WEDNESDAY: result = ld.minusDays(4); break;
case THURSDAY: result = ld.minusDays(3); break;
case FRIDAY: result = ld.minusDays(2); break;
case SATURDAY: result = ld.minusDays(1); break;
case SUNDAY: result = ld; break;
}
break;
default:
throw new DateTimeException("Bad day of week.");
}
return result;
}
/**
* @brief Get a LocalDate which identifies the week.
*
* The week is anchored to Monday.
*
* @param ld The input date
*
* @return A date which is the same for all days of the week.
*
* @throws SQLException
*/
public static LocalDate toWeek(LocalDate ld) throws Exception {
return toWeek(ld, DayOfWeek.MONDAY);
}
}