Java Stream APIで2つの差分のLocalDateな日付Listを作るTips
🧑🏻‍💻

Java Stream APIで2つの差分のLocalDateな日付Listを作るTips

Category
Author
Description
Java Stream APIで2つの差分のLocalDateな日付Listを作るTips
Published
February 14, 2023
Last Updated
Last Updated February 15, 2023
Writings
この記事は約6分で読めます

💡結論として

結論これです。

Stream APIで2つの日数の差分の日付リストを取得できるコード

LocalDate startDate = LocalDate.of(2023, 02, 14); long numOfDays = ChronoUnit.DAYS.between(LocalDate.of(2023, 02, 14), LocalDate.of(2023, 02, 18)); List<LocalDate> daysRange = Stream .iterate(startDate, date -> date.plusDays(1)) .limit(numOfDays) .collect(Collectors.toList());
Stream.iterate(startDate, date -> date.plusDays(1))
でdateに対してプラス1日し続けます。
.limit(numOfDays)
で制限を書けると。
今回の場合は2つの日付を与えられるとそこから差分を出したいのでこんな感じです。
public List<LocalDate> createBetweenDates(final LocalDate startDate, final LocalDate endDate) { if (Objects.isNull(startDate) || Objects.isNull(endDate)) { return null; } long diffDate = ChronoUnit.DAYS.between(startDate, endDate) + 1; return Stream .iterate(startDate, date -> date.plusDays(1)) .limit(diffDate).collect(Collectors.toList()); }

ポイント

  • ChronoUnitでbetweenを求めるときはどちらかがnullだと落ちるのでnullチェックが必要です
  • 日付の差分がないと1個もリストを作成してくれないので1日だけ差分が出るようにする
    • 2022-01-012022-01-02にして[2022-01-01]が返るようにしている

他の手段があるとすれば

for文で書くとこんな

public static List<Date> getDaysBetweenDates(Date startdate, Date enddate) { List<Date> dates = new ArrayList<Date>(); Calendar calendar = new GregorianCalendar(); calendar.setTime(startdate); while (calendar.getTime().before(enddate)) { Date result = calendar.getTime(); dates.add(result); calendar.add(Calendar.DATE, 1); } return dates; }

While文で書くとこんな

List<Date> dates = new ArrayList<Date>(); String str_date ="27/08/2010"; String end_date ="02/09/2010"; DateFormat formatter ; formatter = new SimpleDateFormat("dd/MM/yyyy"); Date startDate = (Date)formatter.parse(str_date); Date endDate = (Date)formatter.parse(end_date); long interval = 24*1000 * 60 * 60; // 1 hour in millis long endTime =endDate.getTime() ; // create your endtime here, possibly using Calendar or Date long curTime = startDate.getTime(); while (curTime <= endTime) { dates.add(new Date(curTime)); curTime += interval; } for(int i=0;i<dates.size();i++){ Date lDate =(Date)dates.get(i); String ds = formatter.format(lDate); System.out.println(" Date is ..." + ds); }

まとめ

意外と簡単そうでぱっと出てこなかったので書いてみました。やはりStream APIすっきりしていいですね!

書籍

おすすめJava書籍。Javaをやってる人でも一度でも目を通すとだいぶ理解が深まります。

引用など

 
いかがでしたか?この記事が良いと思ったらシェアお願いします!著者がすごく喜びます。