19

我需要在 scala 中创建一个函数,给定日期范围,给我一个范围列表。我在 Scala 中相对较新,我无法弄清楚如何为它编写正确的“for”循环。这是我到目前为止所做的:

def calculateDates(from: LocalDate, until: LocalDate): Seq[LocalDate] = {
  var dateArray = []
  //for (LocalDate date <- from; !date.isAfter(to); date <- date.plusDays(1)) 
  for(date <- from to until)
  {
        dateArray :+ date
  }
  return dateArray 
} 

我不知道如何迭代范围。

4

6 回答 6

28

如果您碰巧使用 Java 1.8 DateTimeAPI(或其 1.7 backport threeten),那么您可以编写

def between(fromDate: LocalDate, toDate: LocalDate) = {
    fromDate.toEpochDay.until(toDate.toEpochDay).map(LocalDate.ofEpochDay)
} 
于 2015-01-28T14:10:48.230 回答
20
val numberOfDays = Days.daysBetween(from, until).getDays()
for (f<- 0 to numberOfDays) yield from.plusDays(f)
于 2013-10-17T12:41:08.237 回答
7

试试这个

def dateRange(start: DateTime, end: DateTime, step: Period): Iterator[DateTime] =
Iterator.iterate(start)(_.plus(step)).takeWhile(!_.isAfter(end))

要生成每个日期,您可以将步骤设置为 1 天,例如

val range = dateRange(
<yourstartdate>,
<yourenddate>,
Period.days(1))
于 2013-10-17T12:40:42.777 回答
6

在运行ScalaJava 9+,我们可以利用新的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)

并包括范围内的最后一个日期:

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)
于 2018-09-24T22:01:22.340 回答
3

使用南丫枣

$ 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)

DateRange是以懒惰的方式评估的。随意构建一个 5000 年的日期范围。:)

于 2014-06-11T17:58:52.047 回答
2

由于 Scala 是函数式的,因此请使用递归:

def calculateDates(from: LocalDate, until: LocalDate): Seq[LocalDate] = {
    if from.compareTo(until) > 1
        return[]
    else
        return from :: calculateDates(from.plusDays(1), until)
} 
于 2013-10-17T12:41:00.107 回答