2016-10-18 10 views
1

Joda-Timeに年を切り上げる方法がありますか?Joda-Timeで年を切り上げる方法

あなたは、DateTime startDate = 10-18-2016とDateTime endDate = 12-18-2017があるとします。私は2年に丸めたいと思っています。

現在、私が行うとき:

Years yearsBetween = Years.yearsBetween(startDate, endDate); 

は私がyearsBetween = 1.ジョダ時間を使用してこの問題を解決するための簡単な方法はあり得るか、私はこれを処理するためのカスタムメソッドを記述する必要がありますか?

+1

endDateにマイナス1日を追加できます。 –

+1

単純な計算を使ってみませんか? \t \t 'int years =(int)Math.ceil((double)Days.daysBetween(startDate、endDate).getDays()/ 365);' – asdf

答えて

2

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クラスを取得するには?

  • Java SE 8SE 9以降
    • 内蔵しています。
    • バンドルされた実装の標準Java APIの一部です。
    • Java 9には、いくつかのマイナーな機能と修正が加えられています。
  • Java SE 6SE 7
    • java.time機能の多くはThreeTen-BackportのJava 6 & 7に戻って、移植されます。
  • Android
    • ThreeTenABPプロジェクトはThreeTen-バックポート具体的にAndroidのため(上記)を適応させます。
    • How to use…を参照してください。

ThreeTen-Extraプロジェクトでは、追加のクラスでjava.timeを拡張します。このプロジェクトは、将来のjava.timeへの追加の可能性を証明する土台です。ここでは、IntervalYearWeekYearQuartermoreなどの便利なクラスがあります。

関連する問題