web-dev-qa-db-ja.com

Java 1年の日数、または2つの日付の間の日数を計算します

ネイティブJavaクラスに、特定の年の日数を計算するメソッドはありますか?のように、それは うるう年 (366日)でしたか? )または通常の年(365日)?

それとも自分で書く必要がありますか?

たとえば、誕生日までの残り日数など、2つの日付の間の日数を計算しています。うるう年の2月29日を考慮に入れたいと思います。 29日を除いてすべて完了しました。

17
jurchiks

以来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;
4
epox

これを行う別の方法は、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が返されます。

47

tl; dr

Year.of( 2015 )
    .length()

Java.time

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.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い legacy 日時クラスに取って代わります。 Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行をアドバイスします。

詳細については、 Oracleチュートリアル を参照してください。そして、StackOverflowで多くの例と説明を検索してください。仕様は JSR 31 です。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある試験場です。 IntervalYearWeekYearQuarter などの便利なクラスがここにあります。 、および more

16
Basil Bourque

GregorianCalendar標準クラスにはisLeapyear()メソッドがあります。取得したのが年番号(たとえば、_2008_)だけの場合は、 this コンストラクターを使用して日付を作成し、その後isLeapYear()メソッドを確認します。

15
Marc B

DateTimeの計算には、 JodaTime ライブラリを使用することを強くお勧めします。特に必要なものについては、ワンライナーになります。

Days.daysBetween(date1, date2).getDays();

これがお役に立てば幸いです。

6
Matthew Sant
5
brian_d

ウィキペディアのページ いくつかの非常に優れた擬似コードを見ることができます:

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で実装する方法を理解できると確信しています。 :-)

3
Platinum Azure

正確なユースケースは、Jodaとこの特定の で最もよく解決される可能性があります。

3
Jacob Tomaw

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()で起こります。とにかく、このように対処する必要はありません。

1
Waldheinz