TL; DR
- は、最初にその年の開始日を移動します。
- 終了日をの最初に移動し、年にします。
ハーフオープン
ジョダタイムは最初は包括で、結末は排他ある時間のスパンにハーフオープンなアプローチを、使用しています。だから1年は問題の年の1月1日から始まり、翌年の1月1日まで実行されますが、含まれません。
したがって、2016-2017の日付を2年間にしたい場合は、開始日をその年の最初の日に移動し、の最初の年に移動します。年です。
LocalDate
に変換します。私たちはこの計算の時間を気にしません。
LocalDate start = startDate.toLocalDate().withDayOfMonth(1).withMonthOfYear(1); // Move to first of same year.
LocalDate stop = endDate.toLocalDate().withDayOfMonth(1).withMonthOfYear(1).plusYears(1); // Move to first of *following* year.
次に、Years
と同じ計算を実行します。 2016年の任意の日付の2
で
Years yearsBetween = Years.yearsBetween(start , stop); // Half-Open, beginning is inclusive while ending is exclusive.
int years = yearsBetween.getYears(); // Plain integer.
結果(2018年1月1日に移動)と2017(2016年1月1日に移動します)。
java.time
FYI、Joda-Timeプロジェクトがjava.timeクラスへの移行を助言チームと、maintenance modeになりました。
この作業は、java.timeで少しシンプルです。 TemporalAdjuster
インターフェイスでは、日付時刻値を操作するクラスが用意されています。 TemporalAdjusters
クラス(複数のs
に注意)はいくつかの実装を提供します。これらは、今年の初めと来年の初めを得るためのものです。
ここでZdt
ここでは、あなたが手に持つ可能性があるZonedDateTime
オブジェクトを参照しています。このクラスは、ナノ秒の分解能を持つ特定のタイムゾーン(ZoneId
)のタイムライン上の瞬間を表します。 ZonedDateTime
オブジェクトからLocalDate
に変換し、TemporalAdjuster
オブジェクトのペアを適用して、年と翌年の最初に移動します。
LocalDate start = yourStartingZdt.toLocalDate().with(TemporalAdjusters.firstDayOfYear());
LocalDate stop = yourEndingZdt.toLocalDate().with(TemporalAdjusters.firstDayOfNextYear());
java.timeクラスには、Joda-Time Years
クラスに相当するものは含まれていません。必要に応じてThreeTen-Extraプロジェクトをアプリケーションに追加して、Years
クラスを含むクラスを追加してjava.timeを拡張することができます。
また、Period
クラスを使用して年数を取得することもできます。
Joda-Timeのように、Period
を含むjava.timeクラスは、時間の半分までの半オープンアプローチを使用します。 Half-Openを使用することをお勧めします。すべての日時作業で一貫してコードをシンプルに、エラーを起こしにくいものにします。 2016年の任意の日付の2
で
Period p = Period.between(start , stop);
int years = p.getYears();
結果(2018年1月1日に移動)と2017(2016年1月1日に移動します)。
java.time
についてjava.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date
,.Calendar
,& java.text.SimpleDateFormat
などの面倒な古いlegacy日時クラスに取って代わります。
Joda-Timeプロジェクトは、今maintenance modeで、java.timeへの移行をアドバイスします。
詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。仕様はJSR 310です。
ここで、java.timeクラスを取得するには?
ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、Interval
、YearWeek
、YearQuarter
、moreなどの便利なクラスがあります。
endDateにマイナス1日を追加できます。 –
単純な計算を使ってみませんか? \t \t 'int years =(int)Math.ceil((double)Days.daysBetween(startDate、endDate).getDays()/ 365);' – asdf