2016-04-07 11 views
5

ここに私のScalaのケースクラスのDateRangeです:停止タイミングを除いた日付範囲を取得

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

サンプル入力データ(ジョダ):私はList[DateRange]として結果を取得しようとしています

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 

は、停止時間間隔を除いて。日付範囲と時間範囲は多分何でもよい。私はこのような試みた

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

:上記の入力データに対して

所望の出力

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

をこれを試してみてくださいと "etはいつも終わりの終わりの時間になります"どのようにst.isBefore(et)falseができますか? –

+0

tldrソートする方法を見つける –

+0

@AlexeyRomanov ...停止開始時刻が翌日に開始され、停止終了時刻が翌日の朝に終了することがあります。 – Jet

答えて

3

を "stは常に停止時間を開始します" 場合は、

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)) 
} 
関連する問題