2013-10-17 11 views
7

Ho bisogno di fare una funzione in scala che, dato un intervallo di date, mi dà una lista della gamma. Sono relativamente nuovo in Scala e non sono in grado di capire come scrivere il ciclo 'for' giusto per lo stesso. Questo è quello che ho fatto fino ad ora:Dato un intervallo, ottenendo tutte le date all'interno dell'intervallo in Scala

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 
} 

Non so come iterare nell'intervallo.

risposta

11
val numberOfDays = Days.daysBetween(from, until).getDays() 
for (f<- 0 to numberOfDays) yield from.plusDays(f) 
+0

" Days "è una classe in scala? –

+1

è una classe in joda-time che sembra utilizzare: http://joda-time.sourceforge.net/apidocs/org/joda/time/Days.html – Ashalynd

4

Prova questo

Per generare ogni data, è possibile impostare il passaggio a 1 giorno come

val range = dateRange(
<yourstartdate>, 
<yourenddate>, 
Period.days(1)) 
+0

Questa può essere una soluzione povera a seconda delle esigenze, perché con start = new DateTime (2015, 1, 30, 0, 0), end = new DateTime (2015, 5, 2, 0, 0), step = Period.months (1) restituisce "2015-01-30", "2015- 02-28 "," 2015-03-28 "," 2015-04-28 ", non" 2015-01-30 "," 2015-02-28 "," 2015-03-30 "," 2015-04 -30 " – jbrown

0

Poiché Scala è un funzionale, andare con una ricorsione:

def calculateDates(from: LocalDate, until: LocalDate): Seq[LocalDate] = { 
    if from.compareTo(until) > 1 
     return[] 
    else 
     return from :: calculateDates(from.plusDays(1), until) 
} 
2

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

Questo DateRange viene valutata in modo artificiale. Sentiti libero di costruire un intervallo di date di 5000 anni. :)

9

Se vi capita di usare il datetime API Java 1.8 (o il suo 1,7 backport threeten), allora si potrebbe scrivere

def between(fromDate: LocalDate, toDate: LocalDate) = { fromDate.toEpochDay.until(toDate.toEpochDay).map(LocalDate.ofEpochDay) }

Problemi correlati