在一天结束时和第二天开始时合并日期时间范围

时间:2016-04-21 04:55:23

标签: scala datetime

这是我的输入数据

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

我要找的所需输出是

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

此处ed1, ed3是当天的结束,sd1, sd3是相应日期的当天开始。我想在上面所需的输出中看到合并那种范围。

我尝试过这样的分区

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

但没有得到如何合并结果。提前谢谢。

1 个答案:

答案 0 :(得分:0)

您可以使用zip来获得结果:

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

这里sd1是else部分的任何日期时间,并在最后过滤掉它。