Как рассчитать данные за каждый месяц в диапазоне времени и добавить в один список, если знать время - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть время начала: startTime: 09-2017, а время окончания - endTime: 05-2018. Я хочу рассчитать количество данных каждый месяц, а затем сложить, чтобы рассчитать данные в период от начала до конца. Например, время начала 09-2017 и заканчивается 5-2018. В 8-месячный период я ​​хочу рассчитать данные за каждый месяц, а затем сложить, чтобы рассчитать период за все время. Я использовал цикл for для времени окончания минус один месяц. Цикл остановится, если месяц endTime равен monthOfStartTime. Я сохраняю данные в arrayList и через месяц добавлю их обратно. Ниже мой код:

startTime: 09-2017; время окончания: 05-2018;

@Autowired
private StudentDao studentDao;
//total students in 8 month
List<Student> students = new ArrayList<>();


//caculator data in everyMonth
 for (int i = dateTimeNow.getMonthOfYear(); i >= 0; i--) {
    //break if equal startTime.
    LocalDateTime startTimeCaculator = endTime.getMonthOfYear().minusMonths(i-1);
    List<Student> studentOnMonth =
     studentDao.getDataEveryMonth(startTimeCaculator,endTime);
    students.addAll(studentOnMonth);
   }

У меня два вопроса. Каково условие остановки цикла при подсчете даты начала? Во-вторых, если я использую переменную i = endTime.getMonthOfYear, цикл будет отсчитываться с конца месяца до нуля и не будет учитываться в течение многих лет. Время закончить 5-2018, цикл будет выполняться 5 раз и не будет считаться в течение месяцев 2017. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Я бы контролировал цикл следующим образом:

    YearMonth endMonth = YearMonth.of(2018, Month.MAY);
    YearMonth startMonth = YearMonth.of(2017, Month.SEPTEMBER);
    for (YearMonth m = endMonth; m.isAfter(startMonth); m = m.minusMonths(1)) {
        LocalDateTime monthStart = m.atDay(1).atStartOfDay();
        LocalDateTime monthEnd = m.plusMonths(1).atDay(1).atStartOfDay();

        System.out.println("Month from " + monthStart + " inclusive to " + monthEnd + " exclusive");
    }

Когда фрагмент находится здесь, он выдает:

Month from 2018-05-01T00:00 inclusive to 2018-06-01T00:00 exclusive
Month from 2018-04-01T00:00 inclusive to 2018-05-01T00:00 exclusive
Month from 2018-03-01T00:00 inclusive to 2018-04-01T00:00 exclusive
Month from 2018-02-01T00:00 inclusive to 2018-03-01T00:00 exclusive
Month from 2018-01-01T00:00 inclusive to 2018-02-01T00:00 exclusive
Month from 2017-12-01T00:00 inclusive to 2018-01-01T00:00 exclusive
Month from 2017-11-01T00:00 inclusive to 2017-12-01T00:00 exclusive
Month from 2017-10-01T00:00 inclusive to 2017-11-01T00:00 exclusive

Если это не совсем то, что вы хотели, пожалуйста, настройте.

Вы также можете изменить DAO своего ученика, чтобы он принимал аргумент YearMonth. Это будет зависеть от требуемой гибкости: передача двух экземпляров datetime допускает более короткие или более длительные периоды, чем один месяц, поэтому дает большую гибкость.

Редактировать: Если вы хотите, чтобы startMonth был включен, используйте «не до», чтобы означать «включено» или «после», например:

    YearMonth endMonth = YearMonth.of(2017, Month.OCTOBER);
    YearMonth startMonth = YearMonth.of(2017, Month.SEPTEMBER);
    for (YearMonth m = endMonth; ! m.isBefore(startMonth); m = m.minusMonths(1)) {
        LocalDateTime monthStart = m.atDay(1).atStartOfDay();
        LocalDateTime monthEnd = m.plusMonths(1).atDay(1).atStartOfDay();

        System.out.println("Month from " + monthStart + " inclusive to " + monthEnd + " exclusive");
    }

Выход:

Month from 2017-10-01T00:00 inclusive to 2017-11-01T00:00 exclusive
Month from 2017-09-01T00:00 inclusive to 2017-10-01T00:00 exclusive
0 голосов
/ 02 сентября 2018

Вы можете использовать функцию isAfter () следующим образом:

LocalDateTime endTime= ....; // 05-2018
LocalDateTime startTime= ....; // 09-2017
while(endTime.isAfter(startTime)){
   endtime = endTime.minusMonths(1);
   ....
   ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...