查找距当前日期最近的时间范围

时间:2019-05-20 12:35:07

标签: kotlin functional-programming

我有一些对象清单。它们每个都包含指定的特定“开始”和“结束”时间范围。

例如:

import org.joda.time.DateTime

data class MyObject(
val from: String?,
val to: String?
)

asUtcDateTime()只是我的扩展方法,它将给定的String转换为DateTime

如何找到最近的物体:

  • 不在今天的时间范围内
  • 距离今天(未来或过去)最近吗?

到目前为止,我尝试的只是从过去和将来获取最近的MyObject,就像这样:

    val now = DateTime.now()

     val nearestPastSchedule = allSchedules
        .sortedBy { it.to.asUtcDateTime() }
        .filter { it.to.asUtcDateTime() != null }
        .lastOrNull { it.to.asUtcDateTime()!!.millis < now.withTimeAtStartOfDay().millis }

    val nearestFutureSchedule = allSchedules
        .sortedBy { it.from.asUtcDateTime() }
        .filter { it.from.asUtcDateTime() != null }
        .lastOrNull { it.from.asUtcDateTime()!!.millis > now.withTimeAtStartOfDay().millis }

不知道在比较它们方面会是什么好的解决方案(考虑到存在可空值),而且还为它们每个返回了实际的MyObject

1 个答案:

答案 0 :(得分:1)

您可以自己查找指定的元素,而不是进行排序。为此,我找到了现在与对象中指定的时间之间的绝对最小差。

出于简单原因,我将数据类调整为使用ZonedDateTime(假设Java> = 8可用):

    data class MyObject(
            val from: ZonedDateTime?,
            val to: ZonedDateTime?
    )

这样,您可以过滤并找到从现在到相应时间之间的最小绝对值:

val nearestPastSchedule = 
    allSchedules.filter { it.to != null }
                .minBy { abs(it.to!!.toInstant().toEpochMilli() - now) }
val nearestFutureSchedule =
    allSchedules.filter { it.from != null }
                .minBy { abs(it.from!!.toInstant().toEpochMilli() - now) }