ТЛ; др
YearMonth // Represent a specific month as a whole.
.now( // Determine the current month as seen in the wall-clock time used by the people of a particular region (a time zone).
ZoneId.of( "Asia/Tokyo" ) // Specify your desired/expected time zone.
) // Returns a `YearMonth` object.
.withMonth( 1 ) // Move back to January of this year. Returns another `YearMonth` object rather than changing (mutating) the original, per the immutable objects pattern.
.minusYears( 2 ) // Jump back two years in the past. Returns yet another `YearMonth` object.
java.time
Вы используете ужасные старые классы даты и времени, которые были вытеснены годами назад современными java.time классами.
Кроме того, вы игнорируете вопрос о часовом поясе. Часовой пояс имеет решающее значение при определении даты. В любой момент времени дата меняется по всему земному шару в зависимости от зоны. Например, через несколько минут после полуночи в Париж Франция - это новый день, а еще «вчера» в Монреаль Квебек .
Укажите собственное имя часового пояса в формате Continent/Region
, например America/Montreal
, Africa/Casablanca
или Pacific/Auckland
. Никогда не используйте 2-4 буквенные сокращения, такие как EST
или IST
, так как они не истинные часовые пояса, не стандартизированы и даже не уникальны (!).
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
YearMonth
Вы заботитесь только о году и месяце без какой-либо даты. Так что используйте YearMonth
класс.
ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
YearMonth yearMonthNow = YearMonth.now( z ) ;
YearMonth yearMonthJanuaryTwoYearAgo = yearMonthNow.withMonth( 1 ).minusYears( 2 ) ;
Увеличивайте месяц за разом, собирая по ходу дела.
ArrayList< YearMonth > yearMonths = new ArrayList<>();
YearMonth ym = yearMonthJanuaryTwoYearAgo ;
while( ! ym.isAfter( yearMonthNow ) )
{
yearMonths.add( ym ) ;
// Set up the next loop.
ym = ym.plusMonths( 1 ) ;
}
Дамп на консоль.
System.out.println( yearMonths ) ;
См. Этот код, запущенный в режиме реального времени на IdeOne.com .
[2017-01, 2017-02, 2017-03, 2017-04, 2017-05, 2017-06, 2017-07, 2017-08, 2017-09, 2017-10, 2017-11, 2017- 12, 2018-01, 2018-02, 2018-03, 2018-04, 2018-05, 2018-06, 2018-07, 2018-08, 2018-09, 2018-10, 2018-11, 2018-12, 2019-01, 2019-02, 2019-03, 2019-04, 2019-05, 2019-06]
Если вы хотите исключить текущий месяц, используйте:
while( ym.isBefore( yearMonthNow ) )