Get date ranges excluding stop timings

Here is my scala DateRange class class:

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

Sample Input (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 

I am trying to get the result as List[DateRange] except for the stop time intervals. Date ranges and time intervals can be anything.

Required output for the above input:

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

I tried like this:

 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)) } 
+5
source share
1 answer

Try it,

 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)) } 
+3
source

Source: https://habr.com/ru/post/1246616/


All Articles