web-dev-qa-db-ja.com

Joda-Timeを使用して特定の月内の日数を取得するにはどうすればよいですか?

30 days hath September,
   April, June and November,
 All the rest have 31,
   Excepting February alone
(And that has 28 days clear,
   With 29 in each leap year).

この情報を解剖学的に取得できますか? (もちろん、詩を意味するものではありません)

55
Manuel Aráoz

月の値を表すDateTimeオブジェクトがある場合、それは非常に簡単です。そのdayOfMonthオブジェクトからDateTimeプロパティを取得し、プロパティの最大値を取得します。サンプル関数は次のとおりです。

public static int daysOfMonth(int year, int month) {
  DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
  return dateTime.dayOfMonth().getMaximumValue();
}
98
Erick Robertson

はい。ただし、見た目ほどきれいではありません。

import org.joda.time.*;
import org.joda.time.chrono.*;
import org.joda.time.field.*;

public class Test {
    public static void main(String[] args) {
        GregorianChronology calendar = GregorianChronology.getInstance();
        DateTimeField field = calendar.dayOfMonth();

        for (int i = 1; i < 12; i++) {
            LocalDate date = new LocalDate(2010, i, 1, calendar);
            System.out.println(field.getMaximumValue(date));
        }
    }
}

12か月あるという仮定をハードコーディングし、2010年に興味があることに注意してください。explicitlyグレゴリオ暦を選択しました-他の暦では異なることがありますもちろん答えます。 (そして、「12か月」ループも有効な仮定ではありません...)

値を取得するためにLocalDateではなくDateTimeを探しましたが、値がタイムゾーンに依存しないことを(わずかに:)強調しています。

これはまだ見た目ほど単純ではありません。 1つの年表を使用してLocalDateを作成するとどうなるかはわからないが、別の年表のフィールドの最大値を要求する。私はmightが何であるかについていくつかのアイデアを持っています。JodaTimeについてある程度の知識はありますが、それはおそらく良いアイデアではありません:)

4
Jon Skeet
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
0
Benoit Courtine