我能想出的唯一解决方案就是在日子里向后走,手动检查一天是否满足约束条件。这里有一个通用类倒着走路经过的时间来寻找一个DateTime
满足一些约束:
class PreviousAdjuster(constraints: (DateTimeField, Int)*) extends WithAdjuster {
val unit = constraints.map(_._1.getBaseUnit).minBy(_.getDuration)
def doWithAdjustment(dateTime: DateTime): DateTime = {
var curr = dateTime
while (constraints.exists{case (field, value) => curr.get(field) != value}) {
curr = curr.minus(1, unit)
}
curr
}
}
,然后我可以使用调节的with
方法DateTime
的:
val lastFridayThe13th = LocalDate.of(2012, 12, 12).`with`(new PreviousAdjuster(
ChronoField.DAY_OF_MONTH -> 13,
ChronoField.DAY_OF_WEEK -> DayOfWeek.FRIDAY.getValue))
println(lastFridayThe13th) // prints 2012-07-13
感觉就像应该有一个更有效的方法来做到这一点,因为约束意味着我们不必每天都在步行,但我不知道如何实现...
这对于13号星期五的特定问题肯定更有效。尽管如此,它并没有很好地概括任何其他领域。例如,如果我切换到“DAY_OF_YEAR”而不是“DAY_OF_MONTH”,或者如果我添加了另一个约束,就像它也必须在2月份一样,您的代码不能直接使用。 – Steve
是的,具体说明DAY_OF_MONTH和DAY_OF_WEEK的组合预计将配置调节器。对于其他条件,无论如何还需要另一种算法 - 由于我们日历的不规则性而导致最终后果。有无限的可能性。没有图书馆可以提供全部,但是你可以自由地为你的具体问题编写自己的调节器。 –
请注意,对于我给这个问题的答案,您不需要为每个问题编写一个新的调整器 - 它将处理任何类型的单位和任何数量的约束。但要使其像每个问题的自定义编码解决方案一样高效,可能相当困难。 – Steve