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).
この情報を解剖学的に取得できますか? (もちろん、詩を意味するものではありません)
月の値を表す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();
}
はい。ただし、見た目ほどきれいではありません。
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についてある程度の知識はありますが、それはおそらく良いアイデアではありません:)
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!