LoginSignup
2
3

More than 3 years have passed since last update.

Scalaで日付の範囲を指定してリストを作る

Last updated at Posted at 2019-12-11

アルプ株式会社でエンジニアをしています、集約のエンティティ@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.untilfromから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

mapfromの日数に範囲コレクションの整数を順に加算していけば、日付のリストが得られます。

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(_))
2
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3