У меня две переменные:
startDate - например 29.04.2018howManyDays - например 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);
}
Я не знаю, как изменить код.
@MattiVirkkunen да, я не знаю, как это изменить
Вы с самого начала понимаете, как работает этот код, или вы просто копируете и вставляете? Если вы прочитаете код и поймете его, вы узнаете, как его адаптировать, потому что он уже делает то, что вы хотите.
Добавление внешней зависимости для этого задания имеет смысл, поскольку его встроенная поддержка (устаревший класс java.util.Calendar) плохо спроектирована. Я бы определенно выбрал ThreeTen Backport, чтобы использовать java.time, современный API даты и времени Java. На домашней странице Joda-Time говорится: «Обратите внимание, что Joda-Time считается в значительной степени« завершенным »проектом. Никаких серьезных улучшений не планируется. Если вы используете Java SE 8, перейдите на java.time (JSR-310) ».




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 должен помочь
Вы можете использовать этот пример кода, чтобы получить 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
Остальные ответы хороши. И, вероятно, пройдет еще некоторое время, пока 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 написано:
Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to
java.time(JSR-310).
Если вы действительно хотите использовать фрагмент из своего вопроса, все, что вам нужно сделать, это удалить первую строку и изменить days на howManyDays во второй и третьей строках.
java.time.
Но у вас уже есть код для того, чтобы делать именно то, что вы хотите, у вас просто
daysвместоhowManyDays. «Я нашел только» означает, что вы только нашли пример чего-то похожего и не можете придумать, как его адаптировать?