Конечно, я не буду выполнять вашу работу по программированию за вас, но я могу дать вам несколько советов.
YearMonth
Чтобы обозначить месяц, используйте YearMonth
класс.
YearMonth yearMonth = YearMonth.of( 2020 , Month.JANUARY ) ;
Вы можете получить YearMonth
на любую дату.
LocalDate ld = LocalDate.of( 2020 , Month.MARCH , 27 ) ;
YearMonth yearMonth = YearMonth.from( ld ) ;
Этот класс можно использовать в качестве ключа вашей карты. Что касается части значения в парах ключ-значение карты, если вы говорите о дробных суммах валют, используйте BigDecimal
для точность , никогда типы с плавающей точкой , с плавающей запятой или двойные.
Map< YearMonth , BigDecimal > monthlyTotals = new TreeMap<> () ;
Map
реализации
Какую реализацию Map
выбрать вам может понадобиться тот, который хранит ключи в хронологическом порядке этих YearMonth
объектов. Если это так, выберите тот, который реализует NavigableMap
. Две такие реализации связаны с Java 11: TreeSet
и ConcurrentSkipListMap
. Используйте второе, если вы манипулируете своей картой в разных потоках.
Вот таблица, которую я сделал, суммирующая особенности различных реализаций карты, связанных с Java 11.
Прошедшие дни
Класс Project имеет начальную дату и конечную дату с функцией, которая вычисляет рабочие дни в интервале
Использование ChronoUnit
класс для подсчета прошедших дней. Использует подход Half-Open, где начало включительно , а окончание эксклюзив .
LocalDate start = LocalDate.of( 2020 , Month.JANUARY , 23 ) ;
LocalDate stop = LocalDate.of( 2020 , Month.FEBRUARY , 15 ) ;
long days = ChronoUnit.DAYS.between( start , stop ) ;
Если вы хотите пропустить определенные дни недели, чтобы считать только «рабочие дни», тогда выполните поиск переполнения стека , чтобы узнать больше, поскольку это было рассмотрено много раз. Вы, вероятно, захотите взглянуть на временные регуляторы в библиотеке ThreeTen-Extra .