2016-04-21 6 views
5

Hier meine Eingangsdatendie Datetime Bereiche Merging am Ende des Tages und der Start des nächsten Tages

case class DateRange(sd:DateTime,ed:DateTime) 

val sd1 = DateTime.parse("2016-04-04T20:00:00.000Z") 
val ed1 = DateTime.parse("2016-04-04T23:59:59.999Z") 

val sd2 = DateTime.parse("2016-04-05T00:00:00.000Z") 
val ed2 = DateTime.parse("2016-04-05T05:00:00.000Z") 

val sd3 = DateTime.parse("2016-04-05T20:00:00.000Z") 
val ed3 = DateTime.parse("2016-04-05T23:59:59.999Z") 

val sd4 = DateTime.parse("2016-04-06T00:00:00.000Z") 
val ed4 = DateTime.parse("2016-04-06T05:00:00.000Z") 

val sd5 = DateTime.parse("2016-04-07T10:00:00.000Z") 
val ed5 = DateTime.parse("2016-04-07T15:00:00.000Z") 

val drList = List(DateRange(sd1,ed1),DateRange(sd2,ed2),DateRange(sd3,ed3),DateRange(sd4,ed4),DateRange(sd5,ed5)) 

Die gewünschte Ausgangs ich suche ist

val res = List(DateRange(sd1,ed2),DateRange(sd3,ed4),DateRange(sd5,ed5)) 

Hier die ed1, ed3 ist Das Ende des Tages und sd1, sd3 sind Tagesbeginn für die jeweiligen Daten. Ich möchte diese Art von Bereichen zusammenführen, wie wir oben in der gewünschten Ausgabe sehen können.

versuchte ich Partitionierung wie diese

val result = drList.partition(x => x.sd.isEqual(x.sd.withTimeAtStartOfDay()) || x.ed.isEqual(x.ed.withTime(LocalTime.parse("23:59:59"))))) 

Aber nicht immer, wie das Ergebnis zu verschmelzen. Danke im Voraus.

Antwort

2

können Sie zip verwenden, um Ihre Ergebnisse zu erhalten:

val res = if(drList.size < 2) 
      { 
       drList 
      } 
      else 
      { 
       drList zip drList.drop(1) map { 
       case (prevRes, nexRes) => 
       if (prevRes.ed.plusMillis(1) == nexRes.sd) prevRes.copy(ed = nexRes.ed) 
       else DateRange(sd1, sd1) 
      } 
      res.filter(x => x.sd != x.ed) 
      } 

Hier sd1 jede Datumzeit ist am anderen Teil zu haben und es Filterung bei der letzten aus.

Verwandte Themen