ネイティブJavaクラスに、特定の年の日数を計算するメソッドはありますか?のように、それは うるう年 (366日)でしたか? )または通常の年(365日)?
それとも自分で書く必要がありますか?
たとえば、誕生日までの残り日数など、2つの日付の間の日数を計算しています。うるう年の2月29日を考慮に入れたいと思います。 29日を除いてすべて完了しました。
以来Java 8
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 birthday is 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;
これを行う別の方法は、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が返されます。
Year.of( 2015 )
.length()
Java 8以降では Java.timeパッケージ 。( チュートリアル )
length
Year
クラスは、単一の年の値を表します。その長さを調べることができます。
int daysInYear = Year.of( 2015 ).length();
isLeap
また、1年がうるう年かどうかを尋ねることもできます。
Boolean isLeapYear = Year.isLeap( 2015 );
例として、Javaの 三項演算子 を使用して、次のように1年の日数を取得します。
minVal =(a <b)? a:b;
私たちの場合、1年の日数が必要です。これは、うるう年以外の場合は365、うるう年の場合は366です。
int daysInYear = ( Year.isLeap( 2015 ) ) ? 366 : 365 ;
日付の曜日番号を取得できます。その数は1から365、またはうるう年では366になります。
int dayOfYear = LocalDate.now( ZoneId.of( "America/Montreal" ).getDayOfYear() ;
反対方向に進んで、1年の日付を取得します。
Year.now( ZoneId.of( "America/Montreal" ) ).atDay( 159 ) ;
単一の年を扱うときにこれらの日数を比較することにより、経過日数を決定できます。しかし、もっと簡単な方法があります。読む。
ChronoUnit
列挙型を使用して経過日数を計算します。
LocalDate start = LocalDate.of( 2017 , 2 , 23 ) ;
LocalDate stop = LocalDate.of( 2017 , 3 , 11 ) ;
int daysBetween = ChronoUnit.DAYS.between( start , stop );
自動的に処理 うるう年 。
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い legacy 日時クラスに取って代わります。 Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行をアドバイスします。
詳細については、 Oracleチュートリアル を参照してください。そして、StackOverflowで多くの例と説明を検索してください。仕様は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある試験場です。 Interval
、 YearWeek
、 YearQuarter
などの便利なクラスがここにあります。 、および more 。
GregorianCalendar
標準クラスにはisLeapyear()
メソッドがあります。取得したのが年番号(たとえば、_2008
_)だけの場合は、 this コンストラクターを使用して日付を作成し、その後isLeapYear()
メソッドを確認します。
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()
で起こります。とにかく、このように対処する必要はありません。