jeudi 7 avril 2016

Get the date ranges excluding the stoppage timings

Here is my scala case class DateRange:

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

The sample input data (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] excluding the stoppage timing intervals. The Date ranges and time ranges maybe anything.

Desired output for the above input data:

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

Aucun commentaire:

Enregistrer un commentaire