I need to make a function in scala that, given a range of dates, gives me a list of the range. I am relatively new in Scala and I am not able to figure out how to write the righ
If you happen to use the Java 1.8 DateTime
API (or its 1.7 backport threeten), then you could write
def between(fromDate: LocalDate, toDate: LocalDate) = {
fromDate.toEpochDay.until(toDate.toEpochDay).map(LocalDate.ofEpochDay)
}
Try this
def dateRange(start: DateTime, end: DateTime, step: Period): Iterator[DateTime] =
Iterator.iterate(start)(_.plus(step)).takeWhile(!_.isAfter(end))
To generate every date, you can set the step to 1 day like
val range = dateRange(
<yourstartdate>,
<yourenddate>,
Period.days(1))
val numberOfDays = Days.daysBetween(from, until).getDays()
for (f<- 0 to numberOfDays) yield from.plusDays(f)
Use Lamma Date
$ scala -cp lamma_2.11-1.1.2.jar
Welcome to Scala version 2.11.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_25).
Type in expressions to have them evaluated.
Type :help for more information.
scala> import io.lamma.Date
import io.lamma.Date
scala> Date(2015, 7, 7) to Date(2015, 7, 10) foreach println
Date(2015,7,7)
Date(2015,7,8)
Date(2015,7,9)
Date(2015,7,10)
This DateRange
is evaluated in a lazy way. Feel free to construct a date range of 5000 years. :)
Since Scala is a functional, go with a recursion:
def calculateDates(from: LocalDate, until: LocalDate): Seq[LocalDate] = {
if from.compareTo(until) > 1
return[]
else
return from :: calculateDates(from.plusDays(1), until)
}
When running Scala
on Java 9+
, we can take advantage of the new java.time.LocalDate::datesUntil:
import java.time.LocalDate
import collection.JavaConverters._
// val start = LocalDate.of(2018, 9, 24)
// val end = LocalDate.of(2018, 9, 28)
start.datesUntil(end).iterator.asScala.toList
// List[LocalDate] = List(2018-09-24, 2018-09-25, 2018-09-26, 2018-09-27)
And to include the last date within the range:
start.datesUntil(end.plusDays(1)).iterator.asScala.toList
// List[LocalDate] = List(2018-09-24, 2018-09-25, 2018-09-26, 2018-09-27, 2018-09-28)