Как мы можем добиться разделения дат / разрыва дат в Java

#java #list #date #java-time #datetime-parsing

#java #Список #Дата #java-время #datetime-синтаксический анализ

Вопрос:

Здесь Java необходимо прочитать файл, в котором есть контракт, член, дата начала и дата окончания. Если есть разделение / разрыв дат в датах, его необходимо заполнить в целевом файле на уровне контракта. Ниже приведен пример исходного файла и целевого файла и ожидаемый результат.

В примере контракт A имеет разделение в элементе 3, поэтому в целевом файле оставшийся диапазон дат должен быть заполнен на уровне контракта

Контракт B имеет разделение в элементах 3 и 4, поэтому в целевом файле недостающий диапазон дат и оставшийся диапазон дат должны быть заполнены на уровне контракта.

Исходный файл:

 Contract  Member    StartDate     EndDate
A           1      01-Jan-2020   31-Dec-2020
A           2      01-Jan-2020   31-Dec-2020
A           3      01-Jan-2020   24-Oct-2020
A           4      01-Jan-2020   31-Dec-2020
                                 
B           1      01-Jan-2020   31-Dec-2020
B           2      01-Jan-2020   31-Dec-2020
B           3      01-Jan-2020   04-Mar-2020
B           3      01-Apr-2020   31-Dec-2020
B           4      01-Jan-2020   04-Mar-2020
B           4      01-Apr-2020   31-Dec-2020
 

Целевой файл:

 Contract   StartDate      EndDate
A        01-Jan-2020    24-Oct-2020
A        25-Oct-2020    31-Dec-2020
                        
B        01-Jan-2020    04-Mar-2020
B        05-Mar-2020    31-Mar-2020
B        01-Apr-2020    31-Dec-2020
 

Комментарии:

1. Какова логика этих диапазонов?

2. Ну, напишите какой-нибудь код. Например. проверьте, совпадает ли конец одного диапазона с началом следующего диапазона, если нет, то вам нужно вычислить недостающий диапазон. Для анализа и сравнения дат доступно несколько API-интерфейсов date.

3. Должны ли указанные диапазоны не перекрываться (как в примере)?

4. Добро пожаловать в StackOverflow! Ваши вопросы выглядят как проблема «выполнить мою задачу бесплатно». Вам нужно написать код и задавать вопросы, только если вы обнаружите проблему.

Ответ №1:

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

ДЕМОНСТРАЦИЯ:

 import java.time.LocalDate;
import java.util.List;

class Main {
    public static void main(String[] args) {
        List<String> dateRangeList = List.of("2019-01-01 2019-02-01", "2019-02-02 2019-04-04", "2019-06-01 2019-07-01");
        for (int i = 0; i < dateRangeList.size() - 1; i  ) {
            String[] currentRange = dateRangeList.get(i).split(" ");
            String[] nextRange = dateRangeList.get(i   1).split(" ");
            LocalDate oneDayAfterLastDateOfCurrentRange = LocalDate.parse(currentRange[1]).plusDays(1);
            LocalDate firstDateOfNextRange = LocalDate.parse(nextRange[0]);
            if (!oneDayAfterLastDateOfCurrentRange.equals(firstDateOfNextRange)) {
                String missingDateRange = oneDayAfterLastDateOfCurrentRange.toString()   " "
                          firstDateOfNextRange.minusDays(1);
                System.out.println("The missing date range is: "   missingDateRange);
                break;
            }
        }
    }
}
 

Вывод:

 The missing date range is: 2019-04-05 2019-05-31