TemporalAdjuster - получение следующей даты от скорректированной даты - PullRequest
0 голосов
/ 13 марта 2020

При условии, что у меня есть пользовательский TemporalAdjuster, который дает мне каждое воскресенье (также может быть каждый второй вторник и т. Д. c ..). Как рассчитать все скорректированные даты в году?

TemporalAdjuster myGamingAdjuster;
int myYear = 2003;
LocalDate myDate = LocalDate.now();
System.out.println(myDate.with(myGamingAdjuster)); // Gives only one date

Ответы [ 2 ]

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

Вы можете создать собственный метод, который будет генерировать то, что вы ожидаете, исходя из двух потребностей вашего вопроса. Вы можете создать метод, подобный этому:

public List<LocalDate> generateDates(int year, int periodicDays, DayOfWeek startDay){
    LocalDate firstDay = LocalDate.of(year, Month.JANUARY, 1)
            .with(TemporalAdjusters.next(startDay));
    List<LocalDate> result = new ArrayList<>();
    do {
        result.add(firstDay);
        firstDay = firstDay.plusDays(periodicDays);
    } while (firstDay.getYear() == year);
    return result;
}

Затем вызовите свой метод следующим образом:

List<LocalDate> allSunDaysInYear = generateDates(2003, 7, DayOfWeek.SUNDAY)
List<LocalDate> allEvrySeconTuesdaysInYear = generateDates(2003, 14, DayOfWeek.MONDAY);

Выходы

[2003-01-05, 2003-01-12, 2003-01-19, 2003-01-26, 2003-02-02, 2003-02-09, ..]
[2003-01-06, 2003-01-20, 2003-02-03, 2003-02-17, 2003-03-03, 2003-03-17, ..]
0 голосов
/ 13 марта 2020

Я предполагаю, что «GamingAdjuster» сообщит вам следующую дату, когда вы сможете включить PlayStation, на основе последней даты, когда вы ее использовали? Мы предполагаем, что эта последняя дата сейчас…

К сожалению, вы не имеете ни малейшего представления о том, добавит ли этот настройщик просто час или будет ли он корректировать дату начала всегда в соответствии с достижимым сочельником, верно?

Тем не менее, вы хотели бы знать, сколько игровых сессий вы можете провести до конца этого года, верно?

Попробуйте что-то вроде этого:

var currentYear = Year.now();
var startDate = LocalDateTime.now();
var counter = 0;

for( var date = startDate.with( myGamingAdjuster ); date.getYear() == currentYear.getValue(); date = date.with( myGamingAdjuster ) )
{
    ++counter;
}

out.println( counter );

Я использую LocalDateTime, потому что, по моему предположению, корректор может добавить один час - это не сработает для LocalDate. И если у вас действительно нет подсказки о том, как работает регулятор, это будет более безопасный вариант.

Мы должны инициализировать date так, как я это сделал, чтобы избежать этого теперь подсчитывается , потому что мы хотим подсчитать только все еще возможные игровые сессии, а текущая закончена ...

...