Groovy вычисление диапазона дат в зависимости от текущего дня недели

Groovy вычисление диапазона дат в зависимости от текущего дня недели

Недавно столкнутся с вопросом: как реализовать на языке Groovy вычисление диапазона дат? Необходимо это было для запуска генерации отчета в определенные дни недели за определенное количество дней. Запуск в определенные дни я переложил на jenkins, настроив Build Triggers. О том, как определить диапазон дат на groovy, и пойдет речь ниже.

Задача №1: Каждый вторник и четверг генерировать и отправлять отчет за определенный период

Во вторник требуется отчет за четверг, пятницу, субботу, воскресенье, понедельник.

В четверг — за вторник, среду.

То есть, есть некая логика, которая позволяет генерировать отчет (на вход её подается два параметра: startDate и endDate) и отправлять его по почте.

Верхнеуровнево задача запускается на jenkins, используя плагин Pipline. В настройках задан параметр «Запускать периодически» со значением «0 6 * * 2,4» каждый вторник (2) и четверг (4) в 6 часов 00 минут:

 Настройка Build Triggers на jenkins для запуска Groovy вычисление диапазона дат.

Далее внутри 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 вычисление диапазона дат.