2016-04-07 14 views
5

Hier ist meine scala Fall Klasse Daterange:Holen Sie sich die Datumsbereiche mit Ausnahme der Nachspiel Timings

case class DateRange(startDT: DateTime, endDT: DateTime) 

Die Probeneingangsdaten (Joda):

val dt1 = DateTime.parse("2016-01-04T03:00:00.000Z") // dt1 will always the range start date time 
val dt2 = DateTime.parse("2016-01-05T04:00:00.000Z") // dt2 will always the range end date time 

val dr = DateRange(dt1, dt2) // container to hold the date ranges 

val st = LocalTime.parse("13:00:00") // st will always the stoppage start time 
val et = LocalTime.parse("02:00:00") // et will always the stoppage end time 

Ich versuche, das Ergebnis als List[DateRange] zu erhalten Ausgenommen die Stop-Timing-Intervalle. Die Datumsbereiche und Zeitbereiche sind möglicherweise alles.

Wunsch Ausgang für die oben Eingangsdaten:

List(DateRange(2016-01-04T03:00:00.000Z,2016-01-04T13:00:00.000Z),DateRange(2016-01-05T02:00:00.000Z,2016-01-05T04:00:00.000Z)) 

ich so versucht:

val result = if (st.isBefore(et)) { 
    if (dr.startDT.isBefore(dr.endDT) && st.isAfter(dr.startDT.toLocalTime)) { 
     DateRange(dr.startDT.withTime(st), dr.startDT.withTime(et)) 
    } else if (dr.startDT.isBefore(dr.endDT) && st.isBefore(dr.startDT.toLocalTime)) { 
     DateRange(dr.endDT.withTime(st), dr.endDT.withTime(et)) 
    } else { 
     DateRange(dr.startDT.withTime(st), dr.startDT.withTime(et)) 
    } 
    } 
    else { 
    if (dr.startDT.isBefore(dr.endDT) && et.isBefore(dr.endDT.toLocalTime) && st.isBefore(dr.endDT.toLocalTime)) { 
     DateRange(dr.startDT.withTime(st), dr.endDT.withTime(23, 59, 59, 999)) 
    } else if (dr.startDT.isBefore(dr.endDT) && et.isBefore(dr.endDT.toLocalTime) && st.isAfter(dr.endDT.toLocalTime)) { 
     DateRange(dr.startDT, dr.endDT.withTime(et)) 
    } else if (dr.startDT.isBefore(dr.endDT) && et.isBefore(dr.endDT.toLocalTime) && st.isAfter(dr.endDT.toLocalTime)) { 
     DateRange(dr.startDT, dr.endDT.withTime(et)) 
    } else { 
     DateRange(dr.startDT.withTime(st), dr.endDT.withTime(et)) 
    } 
+0

Wenn "st wird immer der Stillstand Startzeit" und "und wird immer die Stopp-Endzeit" wie kann st.isBefore (et) falsch sein? –

+0

tldr finden Sie einen Weg, um es zu sortieren –

+0

@AlexeyRomanov ... Stop-Startzeit kann bis zum Ende des Tages beginnen und Stop-End-Zeit kann am nächsten Morgen enden. – Jet

Antwort

3

Das Versuchen,

object Splitter extends App { 

    val shiftStartDate = DateTime.parse("2016-01-04T06:00:00.000") 
    val shiftEndDate = DateTime.parse("2016-01-04T16:00:00.000") 

    val st = LocalTime.parse("23:00:00") 
    val et = LocalTime.parse("08:00:00") 


    val stoppageStartDate = shiftStartDate.toLocalDate.toDateTime(st) 
    val StoppageEndDate = if(st.isBefore(et)){ 
    shiftStartDate.toLocalDate.toDateTime(et) 
    }else{ 
    shiftStartDate.toLocalDate.toDateTime(et).plusDays(1) 
    } 
    val result = if ((stoppageStartDate.isAfter(shiftStartDate) || stoppageStartDate.isEqual(shiftStartDate)) && 
    (StoppageEndDate.isBefore(shiftEndDate) || StoppageEndDate.isEqual(shiftEndDate))) { 
    List(DateRange(shiftStartDate, stoppageStartDate), DateRange(StoppageEndDate, shiftEndDate)) 
    } else if ((stoppageStartDate.isAfter(shiftStartDate) || stoppageStartDate.isEqual(shiftStartDate)) && 
    StoppageEndDate.isAfter(shiftEndDate) && stoppageStartDate.isBefore(shiftEndDate)) { 
    List(DateRange(shiftStartDate, stoppageStartDate)) 
    } 
    else if (stoppageStartDate.isBefore(shiftStartDate) && (StoppageEndDate.isBefore(shiftEndDate) || 
    StoppageEndDate.isEqual(shiftEndDate)) && StoppageEndDate.isAfter(shiftStartDate)) { 
    List(DateRange(StoppageEndDate, shiftEndDate)) 
    } else if (stoppageStartDate.isBefore(shiftStartDate) && StoppageEndDate.isAfter(shiftEndDate)) { 
    Nil 
    } else { 
    List(DateRange(shiftStartDate, shiftEndDate)) 
    } 
    println(">>>> " + result.result.filterNot(x=>x.startTS==x.endTS)) 
} 
Verwandte Themen