YearMonth
Видимо, вы хотите отслеживать значения год-месяц.Для этого есть класс, названный, ну, YearMonth
.Найдите этот класс в пакете java.time , который вытеснит ужасно хлопотные старые классы даты и времени, включенные в самые ранние версии Java.
MonthDay
Или, может быть,вы стреляете по значениям месяца и дня;Ваш вопрос запутан, поэтому я не уверен в вашей цели.Но если это ваша цель, опять же, есть класс для этого: MonthDay
.
Month
Или, может быть, вы хотите просто месяц независимо от годаили день месяца, в этом случае вы можете использовать класс Month
.
LocalDate
Если входные строки представляют год и месяц идень месяца, разобрать как LocalDate
.У этого класса нет времени суток и часового пояса.
LocalDate ld = LocalDate.parse( "2016-01-15" ) ;
Извлечение YearMonth
, MonthDay
или Month
.
YearMonth ym = YearMonth.from( ld ) ;
Создание коллекции,Возможно, вы хотите сохранить все отдельные наборы LocalDate
объектов в конкретный год-месяц.Если это так, создайте Map
, где каждому YearMonth
объекту принадлежит Set
из LocalDate
объектов.
Map < YearMonth, Set < LocalDate > > map = new HashMap <>();
При обработке каждой входной даты проверьте, есть ли на карте Set
еще создано для конкретного YearMonth
ввода.Если нет, создайте экземпляр TreeSet
.Класс TreeSet
- это SortedSet
, то есть он поддерживает отсортированный порядок при добавлении значений.
Set < LocalDate > set = map.get( ym );
if ( null == set ) {
set = new TreeSet <>(); // A `TreeSet` is a `SortedSet`, maintains a sorted order. You may or may not need this behavior.
map.put( ym , set );
}
Имея Set
в руке, добавьте LocalDate
.
set.add( ld );
После обработки вы можете получить набор ключей YearMonth
из вашего Map
.И для каждого из них вы можете получить Set
, которым он владеет, и получить количество содержащихся в нем элементов.
Lamba & Streams
Для более короткого кода вы можете использовать синтаксис Lambda & Streams с Map::computeIfAbsent
.Я видел такой код, но еще не пробовал.
map.computeIfAbsent( key , k -> new TreeSet< LocalDate >() ).add( ld ) ;
Только счетчик
Если вам нужен только счетчик, и вам не нужны значения LocalDate
замените Set
как «значение» или вы Map
на Integer
объект.Вместо извлечения Set
и добавления к нему, извлеките Integer
и увеличьте его, добавив единицу.Лично в такой ситуации лучше всего собрать значения LocalDate
, которые будут проверены для отладки / тестирования и / или для дальнейшего использования в другой бизнес-логике.
О java.time
Платформа java.time встроена в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date
, Calendar
, & SimpleDateFormat
.
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
- Java SE 8 , Java SE 9 , Java SE 10, а позже
- Встроенный.
- Часть стандартного Java API с встроенной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- Android
- Более поздние версии Android связывают реализации классов java.time.
- Для более ранней версии Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянутое выше).См. Как использовать ThreeTenABP… .
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и more .