Groovy вычисление диапазона дат в зависимости от текущего дня недели
Недавно столкнутся с вопросом: как реализовать на языке Groovy вычисление диапазона дат? Необходимо это было для запуска генерации отчета в определенные дни недели за определенное количество дней. Запуск в определенные дни я переложил на jenkins, настроив Build Triggers. О том, как определить диапазон дат на groovy, и пойдет речь ниже.
Задача №1: Каждый вторник и четверг генерировать и отправлять отчет за определенный период
Во вторник требуется отчет за четверг, пятницу, субботу, воскресенье, понедельник.
В четверг — за вторник, среду.
То есть, есть некая логика, которая позволяет генерировать отчет (на вход её подается два параметра: startDate и endDate) и отправлять его по почте.
Верхнеуровнево задача запускается на jenkins, используя плагин Pipline. В настройках задан параметр «Запускать периодически» со значением «0 6 * * 2,4» каждый вторник (2) и четверг (4) в 6 часов 00 минут:
Далее внутри pipline нужно описать логику. Если запуск во вторник, то от текущей даты нужно отнять 1 день и зафиксировать его как endDate. Потом отнять ещё 5 дней и зафиксировать как startDate. В случае четверга отнять 1 день и отнять 2 дня соответственно.
Сама реализация подразумевает использование класса Calendar и его метода DAY_OF_WEEK. Он помогает определить порядковый номер текущего дня недели. Его и будем использовать:
Calendar startEndPeriod = Calendar.getInstance();
int currentDayOfWeek = startEndPeriod.get(Calendar.DAY_OF_WEEK);
Не забываем, что в США и некоторых других странах неделя начинается не с понедельника, а с воскресенья. Поэтому вторник не второй день, а третий; соответственно четверг не четвертый, а пятый.
Собственно всё, код ниже, комментарии по тексту:
Calendar startEndPeriod = Calendar.getInstance();
int currentDayOfWeek = startEndPeriod.get(Calendar.DAY_OF_WEEK);
// если сегодня вторник, то определяем диапазон:
// прошлая неделя - четверг, пятница, суббота, воскресенье
// текущая неделя - понедельник
if (currentDayOfWeek == 3){
// переводим позицию в календаре на -1 день, т.е. на вчера
startEndPeriod.add(Calendar.DATE, -1);
// записываем дату вчерашнего дня в переменную endDate
endDate = startEndPeriod.getTime().format('yyyy-MM-dd');
// переводим позицию в календаре еще на 4 дня назад,
// т.е. на четверг прошлой недели
startEndPeriod.add(Calendar.DATE,- 4);
// записываем в startDate
startDate = startEndPeriod.getTime().format('yyyy-MM-dd');
}
// если сегодня четверг, то определяем диапазон:
// текущая неделя - вторник, среда
else if (currentDayOfWeek == 5) {
// алгоритм то же, что и в предыдущей ветви
startEndPeriod.add(Calendar.DATE, -1);
endDate = startEndPeriod.getTime().format('yyyy-MM-dd');
startEndPeriod.add(Calendar.DATE,-1);
startDate = startEndPeriod.getTime().format('yyyy-MM-dd');
}
echo "Начальная дата выгрузки: ${startDate}" +
"\nКонечная дата выгрузки: ${endDate}";
Задача №2: Каждый месяц 3 числа в 7:00 генерировать и отправлять отчет за предыдущий месяц
Принцип тот же, что и в задаче №1. На вход некоторого метода, который генерирует отчет, подается два параметра: startDate и endDate. Разница в том, что теперь эти даты должны быть первым и последним днем предыдущего месяца.
Задача, всё так же, запускается через jenkins pipline, значение периодичности запуска: «0 7 3 * *» каждый месяц 3 числа в 7 часов 00 минут.
Код ниже:
Calendar startEndMonth = Calendar.getInstance();
startEndMonth.set(Calendar.DAY_OF_MONTH, 0);
String endDate = startEndMonth.getTime().format('yyyy-MM-dd');
startEndMonth.set(Calendar.DAY_OF_MONTH, 1);
String startDate = startEndMonth.getTime().format('yyyy-MM-dd');
echo "Начальная дата выгрузки: ${startDate}" +
"\nКонечная дата выгрузки: ${endDate}";
Вот таким образом можно реализовать на языке Groovy вычисление диапазона дат.