2016-09-04 14 views
1

2つの日付の間の月を数えたい場合は、月を無視してその日数を無視するので、2012-01-312012-02-01には1月の違いがあります。日を無視して2つの日付の間の月を取得する

私はジョダ-時間でこれを行う:

import org.joda.time.*; 
PeriodType yearMonth = PeriodType.yearMonthDay().withDaysRemoved(); 
LocalDate dt1 = new LocalDate(2012, 1, 31); 
LocalDate dt2 = new LocalDate(2012, 2, 1); 
int months = new Period(dt1, dt2, yearMonth).getMonths(); 
System.out.println(months); 

をしかし、私は、出力印刷ました:私は.withDaysRemoved()を使用し、それが働いていないが、

0 

を。私はそれを悪用するか?

答えて

0

java.time

ジョダタイムプロジェクトはメンテナンスモードになりました。チームはjava.timeクラスへの移行を勧告しています。 Jodaの時と同様に

LocalDate

LocalDateがwithout時間日の時間帯なしの日付のみの値を表します。

LocalDate start = LocalDate.of (2012 , Month.JANUARY , 31); 
LocalDate stop = LocalDate.of (2012 , Month.MARCH , 1); 

結果を保持する場所を設定します。

long countMonths = 0; 

YearMonth

YearMonthクラスは、よく、年と月を表します。これは、あなたが望むように、数ヶ月ではなく月全体を考慮するコンジットです。

YearMonth ymStart = YearMonth.from (start); 
YearMonth ymStop = YearMonth.from (stop); 

このYearMonthクラスは、isAfterisBefore、及びequalsとして比較するための方法を有しています。

ChronoUnitクラスは、Temporalオブジェクトのペアの間の経過月数を計算できます。 YearMonthクラスはTemporalを実装しており、ChronoUnitで動作します。

if (ymStart.isAfter (ymStop)) { 
    // Handle error condition. Unexpected input values. 
} else if (ymStart.equals (ymStop)) { 
    countMonths = 0; 
} else { // Else different months. 
    countMonths = ChronoUnit.MONTHS.between (ymStart , ymStop); 
} 

コンソールにダンプします。

System.out.println ("start: " + start + " | stop: " + stop + " | countMonths: " + countMonths); 

開始:2012年1月31日| stop:2012-03-01 | countMonths:上記2

ハーフオープン

結果は結末が排他いる間、初めは包括ある時間のスパンを定義するハーフオープンなアプローチに基づいています。このアプローチは、通常、java.timeクラス全体を含む日時作業で使用されます。

たとえば、昼食時間は正午の最初の瞬間から始まり、午後1時の最初の瞬間まで実行されます。

別の例:1週間は月曜日から始まり、次の月曜日まで実行されますが、それ以降は実行されません。または、この場合、1月から12月までの月のペアと、までですが、、Marchは含まれません。彼らは2ヶ月のスパンをもたらす。

コード全体でHalf-Openアプローチを使用すると、より明確でバグが少なくなると思います。しかし、あなたやあなたのユーザーが他に要求している場合は、上記の結果に1つを追加してください。

java.time

についてjava.timeフレームワークは、Java 8に組み込まれており、後にされています。これらのクラスは、java.util.Date.Calendar、& java.text.SimpleDateFormatなどの面倒な古い日時クラスに取って代わります。

にあるJoda-Timeプロジェクトは、java.timeへの移行を推奨しています。

詳しくはOracle Tutorialをご覧ください。そして、多くの例と説明のためにStack Overflowを検索してください。

java.time機能ThreeTen-BackportでJava 6 & 7に戻って、移植、さらにThreeTenABPAndroidに適合されているの多く(How to use…を参照)。

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

0

LocalDateの月計算では、計算には必ず日が使用されます。日数が使用されないように期間タイプを指定したことを意味します。最終結果には何日も表示されません(ただし、LocalDateの日は内部的に使用されます)。

あなたは別のタイプ、すなわちYearMonth、このタイプは異なる月の算術演算を定義して使用する場合は、:ここで

LocalDate dt1 = new LocalDate(2012, 1, 31); 
LocalDate dt2 = new LocalDate(2012, 2, 1); 

YearMonth ym1 = new YearMonth(dt1.getYear(), dt1.getMonthOfYear()); 
YearMonth ym2 = new YearMonth(dt2.getYear(), dt2.getMonthOfYear()); 

PeriodType yearMonth = PeriodType.yearMonthDay(); 
System.out.println(new Period(ym1, ym2, yearMonth).getMonths()); // 1 
System.out.println(new Period(ym1, ym2, yearMonth.withDaysRemoved()).getMonths()); // 1 

をあなたがいることも見ることができます - PeriodTypeで日を抑制することはできません - YearMonthの文脈で関連性があります。

関連する問題