1

jsr310で「13日の金曜日」という表現を解決しようとしていますが、Joda Timeやその他のライブラリで解決できれば、それでも問題ありません。私はここまで来ました:

val builder = new DateTimeBuilder()
  .addFieldValue(ChronoField.DAY_OF_MONTH, 13)
  .addFieldValue(ChronoField.DAY_OF_WEEK, DayOfWeek.FRIDAY.getValue)

それは「13日の金曜日」を指定しているようです。しかし、これから「13日の金曜日」にどうやって行くのですか?

4

2 に答える 2

1

ここでは、毎月の反復ソリューション (このような 2 つの日付の間に 14 か月を超えることはできないことに注意してください) を使用します。これは、おそらく毎日の反復ソリューションよりも優れています。私は純粋な Java で JSR-310 のベースでそれを書きます - テストされていないため、保証はありません (また、Scala を書く方法がわからないので、ニーズに合わせて調整する必要があります):

public static final TemporalAdjuster LAST_FRIDAY_13 = (Temporal temporal) -> {
  LocalDate test = LocalDate.from(temporal);

  // move to last 13th of month before temporal
  if (test.getDayOfMonth() <= 13) {
    test = test.minus(1, ChronoUnit.MONTHS);
  }

  test = test.withDayOfMonth(13);

  // iterate monthly backwards until it is a friday
  while (test.getDayOfWeek() != DayOfWeek.FRIDAY) {
    test = test.minus(1, ChronoUnit.MONTHS);
  }

  return test;
}

アジャスターは静的定数として保存されることに注意してください (これは、仕様リーダーの Stephen Colebourne によっても推奨されています)。次に、このアジャスターを次のように使用できます。

System.out.println(LocalDate.of(2012, 12, 12).with(LAST_FRIDAY_13));
// Output: 2012-07-13

ところで、他のライブラリでも解決策を求められました。数週間 (3 ~ 4 週間) お待ちいただける場合は、Java 6+ のみを必要とする新しい時間ライブラリを使用して、非常によく似たソリューションを提供します。また、表示されているコードを JodaTime に変換することもできます (多かれ少なかれすぐに実行できるはずです)。

于 2014-01-06T17:43:02.587 に答える
0

私が思いついた唯一の解決策は、日をさかのぼって歩き、その日が制約を満たしているかどうかを手動で確認することでした。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    

制約があるため、毎日歩く必要がないため、これを行うにはもっと効率的な方法があるはずですが、それを実装する方法がわかりません...

于 2012-12-14T10:26:16.690 に答える