Java Как использовать цикл для заполнения списка год и месяц? - PullRequest
0 голосов
/ 27 июня 2019

Как можно циклически отображать год и месяцы для отображения ниже выходных данных?Ограничение отображаемого периода - текущий месяц и год. Кроме того, показывается 3 года включительно года по состоянию на дату.Имеется в виду, что сейчас 2019, покажите 2018 и 2017.

Я попытался с помощью некоторого кода работать как java-приложение в надежде получить ожидаемый результат ниже, но это то, что я пробовал и получил.

Буду признателен, если кто-нибудь сможет пролить здесь немного света.

public class TestClass {
public static void main(String[] args) {
    Calendar today = Calendar.getInstance();
    //month=5, index starts from 0
    int month = today.get(Calendar.MONTH);
    //year=2019
    int year = today.get(Calendar.YEAR);

    for(int i = 0; i < 3; i++) {    //year
        for(int j= 0; j <= month; j++) {    //month
        System.out.println("Value of year: " + (year - 2)); //start from 2017 and iterate to 2 years ahead
        System.out.println("Value of month: " + (month + 1)); //start from January (index val: 1) and iterate to today's month
        }
    }
}

}

Ожидаемый результат:

2017 1 2017 2 2017 32017 4 2017 5 2017 6 2017 7 2017 8 2017 9 2017 10 2017 11 2017 12

2018 1 2018 2 2018 3 2018 4 2018 5 2018 6 2018 7 2018 8 2018 9 2018 10 2018 11 2018 12

2019 1 2019 2 2019 3 2019 4 2019 5 2019 6

Ответы [ 3 ]

5 голосов
/ 27 июня 2019

Попробуйте код ниже.Я использую java 8 и java.time.LocalDate,

LocalDate currentDate = LocalDate.now();
int year = currentDate.getYear();
int month = currentDate.getMonthValue();

for (int i = year - 2; i <= year; i++) {
    for (int j = 1; j <= 12; j++) {
        if (i == year && j == month) {
            System.out.print(i + " " + j + " ");
            break;
        }
            System.out.print(i + " " + j + " ");
        }
    }
}

Вывод

2017 1 2017 2 2017 3 2017 4 2017 5 2017 6 2017 7 2017 8 2017 9 2017 10 2017 11 2017 12 2018 1 2018 2 2018 3 2018 4 2018 5 2018 6 2018 7 2018 8 2018 9 2018 10 2018 11 2018 12 2019 1 2019 2 2019 3 2019 4 2019 5 2019 6 
3 голосов
/ 27 июня 2019

ТЛ; др

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 ) ) 
0 голосов
/ 27 июня 2019

Редактировать: используя год и месяц в цикле

for(int i = year-2; i <= year; i++) {    //year

    for(int j= 1; (j <= 12 || (j == month && i == year)); j++) {    //month
        System.out.println("Value of year: " + i); //start from 2017 and iterate to 2 years ahead
        System.out.println("Value of month: " + j); //start from January (index val: 1) and iterate to today's month
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...