Fixed calculation of calendar date from fiscal-year values.
[fiscal-year.java.git] / src / main / java / com / github / sebhoss / time / AbstractFiscalDateCalculator.java
blobc4af92aa0f3dcbb602400f2704c097234520f955
1 /*
2 * This program is free software. It comes without any warranty, to
3 * the extent permitted by applicable law. You can redistribute it
4 * and/or modify it under the terms of the Do What The Fuck You Want
5 * To Public License, Version 2, as published by Sam Hocevar. See
6 * http://www.wtfpl.net/ for more details.
7 */
8 package com.github.sebhoss.time;
10 import org.joda.time.Days;
11 import org.joda.time.LocalDate;
12 import org.joda.time.Weeks;
14 abstract class AbstractFiscalDateCalculator implements FiscalDateCalculator {
16 protected final int fiscalYearStartMonth;
18 AbstractFiscalDateCalculator(final int fiscalStartMonth) {
19 fiscalYearStartMonth = fiscalStartMonth;
22 @Override
23 public final int calculateFiscalMonth(final LocalDate calendarDate) {
24 final int calendarMonth = calendarDate.getMonthOfYear();
25 final int maximumNumberOfMonths = calendarDate.monthOfYear().getMaximumValue();
27 if (fiscalYearStartMonth <= calendarMonth) {
28 return calendarMonth - fiscalYearStartMonth + 1;
31 return calendarMonth + maximumNumberOfMonths - fiscalYearStartMonth + 1;
34 @Override
35 public final int calculateFiscalWeekOfYear(final LocalDate calendarDate) {
36 final LocalDate fiscalYearStartDate = createMatchingFiscalYearStartDate(calendarDate);
38 return Weeks.weeksBetween(fiscalYearStartDate, calendarDate).getWeeks() + 1;
41 @Override
42 public final int calculateFiscalDayOfYear(final LocalDate calendarDate) {
43 final LocalDate fiscalYearStartDate = createMatchingFiscalYearStartDate(calendarDate);
45 return Days.daysBetween(fiscalYearStartDate, calendarDate).getDays() + 1;
48 private LocalDate createMatchingFiscalYearStartDate(final LocalDate calendarDate) {
49 if (fiscalYearStartMonth <= calendarDate.getMonthOfYear()) {
50 return new LocalDate(calendarDate.getYear(), fiscalYearStartMonth, 1);
53 return new LocalDate(calendarDate.getYear() - 1, fiscalYearStartMonth, 1);
56 @Override
57 public LocalDate calculateCalendarDate(final int fiscalYear, final int fiscalMonth, final int fiscalDay) {
58 final int calendarYear = calculateCalendarYear(fiscalYear, fiscalMonth);
59 final int calendarMonth = calculateCalendarMonth(fiscalMonth);
61 return new LocalDate(calendarYear, calendarMonth, fiscalDay);
64 private final int calculateCalendarMonth(final int fiscalMonth) {
65 return (fiscalMonth + fiscalYearStartMonth - 1) % 12;
68 protected abstract int calculateCalendarYear(int fiscalYear, int fiscalMonth);