アルプ株式会社でエンジニアをしています、集約のエンティティ@pictinyです。
これはScala Advent Calendar 2019 11日目のエントリです。
10日目は@yt8492さんのGradleのプロジェクトでScalaを動かしてKotlinのコードを呼び出すでした。
はじめに
ある任意の日付からある任意の日付までの区間に存在する全ての日付をリストで欲しいときがあります。
import java.time.LocalDate
def range(from: LocalDate, to: LocalDate): Seq[LocalDate] = ???
これを実装していきましょう。
用意するもの
- 日付を扱うのに便利な
java.time.LocalDate
- 期間の単位を扱うための
java.time.temporal.ChronoUnit
scala> import java.time.LocalDate
import java.time.LocalDate
scala> import java.time.temporal.ChronoUnit
import java.time.temporal.ChronoUnit
実装
LocalDate.until
でfrom
からto
までの日数を取得します。
scala> val from = LocalDate.of(2019, 12, 1);
from: java.time.LocalDate = 2019-12-01
scala> val to = LocalDate.of(2019, 12, 31);
to: java.time.LocalDate = 2019-12-31
scala> from.until(to, ChronoUnit.DAYS)
res1: Long = 30
1日分少ないので足します。
scala> from.until(to, ChronoUnit.DAYS).toInt + 1
res2: Int = 31
日数分の範囲コレクションを作ります。
scala> Range(0, from.until(to, ChronoUnit.DAYS).toInt + 1, 1)
res3: scala.collection.immutable.Range = Range 0 until 31
map
でfrom
の日数に範囲コレクションの整数を順に加算していけば、日付のリストが得られます。
scala> Range(0, from.until(to, ChronoUnit.DAYS).toInt + 1, 1).map(from.plusDays(_))
res4: scala.collection.immutable.IndexedSeq[java.time.LocalDate] = Vector(2019-12-01, 2019-12-02, 2019-12-03, 2019-12-04, 2019-12-05, 2019-12-06, 2019-12-07, 2019-12-08, 2019-12-09, 2019-12-10, 2019-12-11, 2019-12-12, 2019-12-13, 2019-12-14, 2019-12-15, 2019-12-16, 2019-12-17, 2019-12-18, 2019-12-19, 2019-12-20, 2019-12-21, 2019-12-22, 2019-12-23, 2019-12-24, 2019-12-25, 2019-12-26, 2019-12-27, 2019-12-28, 2019-12-29, 2019-12-30, 2019-12-31)
まとめ
以下のようなコードで実現できました。
import java.time.LocalDate
import java.time.temporal.ChronoUnit
def range(from: LocalDate, to: LocalDate): Seq[LocalDate] =
Range(0, from.until(to, ChronoUnit.DAYS).toInt + 1, 1).map(from.plusDays(_))