Нахождение пересечения между двумя диапазонами дат в Java (программно) - PullRequest
0 голосов
/ 21 марта 2020

Я хотел бы рассчитать количество перекрывающихся дней между двумя диапазонами дат. Две пары диапазонов дат считываются с консоли в формате: yyyy-mm-dd; Например, если две даты - 2020-01-05 2020-03-31 и 2020-01-05 2020-03-20, программа должна найти дни между 2020-01-05 и 2020-03-20. Тем не менее, это не работает. Я хотел бы спросить, как я могу это исправить?

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.Scanner;

    public class Dates {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String a  = sc.nextLine();
            String b = sc.nextLine();
            String c  = sc.nextLine();
            String d = sc.nextLine();
            LocalDate ldt1 = LocalDate.parse(a);
            LocalDate ldt2 = LocalDate.parse(b);
            LocalDate ldt3 = LocalDate.parse(c);
            LocalDate ldt4 = LocalDate.parse(d);
            System.out.println(ChronoUnit.DAYS.between(ldt1,ldt2,ldt3,ldt4));
        }

    }

1 Ответ

1 голос
/ 21 марта 2020

Это немного сложнее, чем это (не плохо).

    String i1StartStr = "2020-01-05";
    String i1EndStr = "2020-03-31";
    String i2StartStr = "2020-01-05";
    String i2EndStr = "2020-03-20";
    LocalDate i1Start = LocalDate.parse(i1StartStr);
    LocalDate i1End = LocalDate.parse(i1EndStr);
    LocalDate i2Start = LocalDate.parse(i2StartStr);
    LocalDate i2End = LocalDate.parse(i2EndStr);

    if (i1End.isBefore(i1Start) || i2End.isBefore(i2Start)) {
        System.out.println("Not proper intervals");
    } else {
        long numberOfOverlappingDates;
        if (i1End.isBefore(i2Start) || i2End.isBefore(i1Start)) {
            // no overlap
            numberOfOverlappingDates = 0;
        } else {
            LocalDate laterStart = Collections.max(Arrays.asList(i1Start, i2Start));
            LocalDate earlierEnd = Collections.min(Arrays.asList(i1End, i2End));
            numberOfOverlappingDates = ChronoUnit.DAYS.between(laterStart, earlierEnd);
        }
        System.out.println("" + numberOfOverlappingDates + " days of overlap");
    }

Вывод из кода в том виде, в котором он здесь представлен:

75 дней перекрытия

Я также использовал более подходящие имена переменных и ввел проверку интервалов, которые вводит пользователь.

Я знаю, что должен был добавить здесь некоторые пояснения, но, честно говоря, я нашел код, использующий java. Время настолько ясное, чтобы читать само по себе, я не знаю, что нужно объяснять. Если вы хотите, чтобы количество дней включало даты начала и окончания, не забудьте добавить 1 к возвращаемому значению от ChronoUnit.DAYS.between(). Пожалуйста, следите за комментариями и дайте мне знать, какое дальнейшее объяснение будет уместным.

...