Как получить список дат с какой-то даты?

У меня две переменные:

  • startDate - например 29.04.2018
  • howManyDays - например 30

Я хочу получить список за 30 дней с даты 29.04.2018. Подскажите, как мне это сделать? Я нашел только дни между двумя свиданиями.

int days = Days.daysBetween(startDate, endDate).getDays();
List<LocalDate> dates = new ArrayList<LocalDate>(days);  // Set initial capacity to `days`.
for (int i=0; i < days; i++) {
    LocalDate d = startDate.withFieldAdded(DurationFieldType.days(), i);
    dates.add(d);
}

Я не знаю, как изменить код.


person haruki.phoenyx    schedule 29.04.2018    source источник
comment
Но у вас уже есть код для выполнения именно того, что вы хотите, у вас просто days вместо howManyDays. «Я нашел» означает, что вы только нашли пример чего-то похожего и не можете придумать, как его адаптировать?   -  person Matti Virkkunen    schedule 29.04.2018
comment
@MattiVirkkunen да, я не знаю, как это изменить   -  person haruki.phoenyx    schedule 29.04.2018
comment
Вы с самого начала понимаете, как работает этот код, или вы просто копируете и вставляете? Если вы прочитаете код и поймете его, вы узнаете, как его адаптировать, потому что он уже делает то, что вы хотите.   -  person Matti Virkkunen    schedule 29.04.2018
comment
Добавление внешней зависимости для этого задания имеет смысл, поскольку его встроенная поддержка (устаревший класс java.util.Calendar) плохо спроектирована. Я бы определенно выбрал ThreeTen Backport, чтобы использовать _ 2_, современный API даты и времени Java. На домашней странице Joda-Time говорится: «Обратите внимание, что Joda-Time считается в значительной степени« завершенным »проектом. Никаких серьезных улучшений не планируется. Если вы используете Java SE 8, перейдите на java.time (JSR-310) ».   -  person Ole V.V.    schedule 29.04.2018
comment
Дубликат: Возвращает список дат с заданным интервалом дат и дней недели как логические и как получить список дат между двумя датами в java. Пожалуйста, внимательно поищите Stack Overflow перед публикацией.   -  person Basil Bourque    schedule 01.05.2018


Ответы (3)


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

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;

public class Days {

    public static void main(String[] args) {
        String startDate = "29/04/2018";
        int howManyDays = 30;

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        LocalDate localDate = LocalDate.parse(startDate, formatter);
        List<LocalDate> dates = new ArrayList<>();
        for (int i = 0; i < howManyDays; i++) {
            dates.add(localDate.plusDays(i));
        }

        //For check
        dates.forEach(System.out::println);
    }
}

Запуск с howManyDays=5 дает:

2018-04-29
2018-04-30
2018-05-01
2018-05-02
2018-05-03
person Jagrut Sharma    schedule 29.04.2018

public static List<LocalDate> getLocalDates(String startdate, int days) {
        List<LocalDate> localDates = new ArrayList<>();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        LocalDate localDate = LocalDate.parse(startdate, formatter);
        for (int i = 1; i <= days; i++) {
            localDates.add(localDate.plusDays(i));

        }
        return localDates;

    }

plusDays должен помочь

person Prashant Thorat    schedule 29.04.2018

Остальные ответы хороши. И, вероятно, пройдет еще некоторое время, пока Java 9 не будет запущена на вашем телефоне Android, но для всех, кто читает это, я хотел бы предоставить фрагмент кода Java 9 (и более поздних версий):

    LocalDate startDate = LocalDate.of(2018, Month.APRIL, 29);
    int howManyDays = 30;
    List<LocalDate> dates = startDate.datesUntil(startDate.plusDays(howManyDays))
            .collect(Collectors.toList());
    System.out.println(dates);

Выход:

[2018-04-29, 2018-04-30, 2018-05-01, 2018-05-02, 2018-05-03, 2018-05-04, 2018-05-05, 2018-05-06, 2018-05-07, 2018-05-08, 2018-05-09, 2018-05-10, 2018-05-11, 2018-05-12, 2018-05-13, 2018-05-14, 2018-05-15, 2018-05-16, 2018-05-17, 2018-05-18, 2018-05-19, 2018-05-20, 2018-05-21, 2018-05-22, 2018-05-23, 2018-05-24, 2018-05-25, 2018-05-26, 2018-05-27, 2018-05-28]

Как я уже сказал в комментарии, предпочитайте java.time, а не Joda-Time (чтобы использовался фрагмент, который вы нашли для своего вопроса). java.time - это современный API даты и времени Java. На домашней странице Joda-Time написано:

Обратите внимание, что Joda-Time считается в значительной степени «законченным» проектом. Никаких серьезных улучшений не планируется. Если вы используете Java SE 8, перейдите на java.time (JSR-310).

Если вы действительно хотите использовать фрагмент из своего вопроса, все, что вам нужно сделать, это удалить первую строку и изменить days на howManyDays во второй и третьей строках.

Ссылки

person Ole V.V.    schedule 29.04.2018