ネイティブJavaクラスに、特定の年の日数を計算するメソッドはありますか?のように、うるう年(366日)または平年(365日)でしたか?
それとも自分で書く必要がありますか?
たとえば、誕生日までの残り日数など、2つの日付の間の日数を計算しています。うるう年の2月29日を考慮に入れたいと思います。29日を除いてすべて完了しました。
Calendar
それを行う別の方法は、特定の年の実際の最大日数をクラスに尋ねることです。
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int numOfDays = cal.getActualMaximum(Calendar.DAY_OF_YEAR);
System.out.println(numOfDays);
これにより、うるう年の場合は366、通常の年の場合は365が返されます。
getActualMaximum
の代わりに使用したことに注意してくださいgetMaximum
。これは常に366を返します。
GregorianCalendar
標準クラスにはメソッドisLeapyear()
があります。年番号(たとえば)だけがある場合は、この2008
コンストラクターを使用して日付を作成し、後でメソッドを確認します。isLeapYear()
1年の日数:
LocalDate d = LocalDate.parse("2020-12-31"); // import java.time.LocalDate;
return d.lengthOfYear(); // 366
私の誕生日までの日数:
LocalDate birth = LocalDate.parse("2000-02-29");
LocalDate today = LocalDate.now(); // or pass a timezone as the parameter
LocalDate thisYearBirthday = birth.withYear(today.getYear()); // it gives Feb 28 if the birth was on Feb 29, but the year is not leap.
LocalDate nextBirthday = today.isAfter(thisYearBirthday)
? birth.withYear(today.getYear() + 1)
: thisYearBirthday;
return DAYS.between(today, nextBirthday); // import static java.time.temporal.ChronoUnit.DAYS;
DateTimeの計算には、JodaTimeライブラリを使用することを強くお勧めします。特に必要なものについては、ワンライナーになります。
Days.daysBetween(date1, date2).getDays();
これがお役に立てば幸いです。
ウィキペディアのページで、非常に優れた擬似コードを確認できます。
if year modulo 400 is 0
then is_leap_year
else if year modulo 100 is 0
then not_leap_year
else if year modulo 4 is 0
then is_leap_year
else
not_leap_year
そのロジックをJavaで実装する方法を理解できると確信しています。:-)
正確なユースケースは、Jodaとこの特定の例で最もよく解決される可能性があります。
TimeUnitクラスを使用できます。あなたの特定のニーズのためにこれはするべきです:
public static int daysBetween(Date a, Date b) {
final long dMs = a.getTime() - b.getTime();
return TimeUnit.DAYS.convert(dMs, TimeUnit.MILLISECONDS);
}
正直なところ、この計算でうるう年がどこで役割を果たすのかはわかりません。多分私はあなたの質問のいくつかの側面を逃しましたか?
編集:愚かな私、うるう年の魔法はで起こりDate.getTime()
ます。とにかく、あなたはそれをこのように扱う必要はありません。