私が思いついた唯一の解決策は、日をさかのぼって歩き、その日が制約を満たしているかどうかを手動で確認することでした。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
制約があるため、毎日歩く必要がないため、これを行うにはもっと効率的な方法があるはずですが、それを実装する方法がわかりません...