Получите будущий двухнедельный свидание - PullRequest
0 голосов
/ 01 мая 2018

Мои двухнедельные платежи начались 1 января 2015 года (это то, что есть в моем объекте Date, кстати, четверг).

Как я узнаю, когда мне придется оплатить мой первый платеж в мае 2018 года? (Меня не волнует второй или третий платеж в месяц).

Я бы показал работу, которую я проделал, но я не могу думать, как решить эту проблему.

Ответы [ 3 ]

0 голосов
/ 01 мая 2018

Я бы использовал Stream<LocalDate> на вашем месте:

LocalDate start = LocalDate.of(2015, 1, 1);

System.out.println(Stream.iterate(start, d -> d.plusWeeks(2))
                         .filter(d -> d.getMonth() == Month.MAY && d.getYear() == 2018)
                         .findFirst()
                         .get());

Выход:

2018-05-03

Я забыл правильный способ получить элемент из бесконечного потока, но это один из методов.

0 голосов
/ 01 мая 2018

Если вы предпочитаете делать это без какого-либо цикла или итерации, это просто требует некоторой хитрости:

    LocalDate firstPayment = LocalDate.of(2015, Month.JANUARY, 1);
    // The first payment in May 2018 must be within the first 14 days of May.
    long weeksAfterFirst
            = ChronoUnit.WEEKS.between(firstPayment, LocalDate.of(2018, Month.MAY, 14));
    // We need an even number of weeks
    if (weeksAfterFirst % 2 != 0) {
        weeksAfterFirst--;
    }
    LocalDate firstInMay = firstPayment.plusWeeks(weeksAfterFirst);
    System.out.println(firstInMay);

Это печатает

2018-05-03

Для того, как приступить к выполнению такой задачи, одним из первых шагов является изучение библиотеки даты и времени, чтобы узнать о возможностях. Ссылка на учебник: Обучающая программа Oracle: Дата и время , объясняющая, как использовать java.time.

0 голосов
/ 01 мая 2018

Вы можете создать объект datetime, затем продолжать добавлять недели (2 * 7 дней), пока месяц и год не будут правильными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...