2012-02-27 16 views
7

6ヶ月前の日付を特定する必要があります。例:6ヶ月前の日付を特定する方法

Feb-27, 2012(Today) - It is Feb and we don't count incomplete month, false 
Feb-01, 2012 - Still Feb so don't count too, false 
Jan-01, 2011 - Completed, false 
Dec-01, 2011 - Completed, false 
Nov-01, 2011 - Completed, false 
Oct-01, 2011 - Completed, false 
Sep-01, 2011 - Completed, false 
Aug-01, 2011 - Completed, false 
Jul-01, 2011 - Already pass 6 complete months, true 

将来どのような日付でも動作するはずです。

私は現在の日付から30 * 6 = 180日を差し引いたと考えましたが、正確ではありません。

たとえば、2011年7月が有効であると確認された場合は、となりますので、その月のすべてのデータを保守します

ありがとうございました。

+0

おそらく動作しなかったものを試しましたか?ジョーダの時間を試しましたか? – Nishant

+0

私はジョーダの時間について知らないので、これを解決する有益なクラスがあるかどうかわかりません。 – lamwaiman1988

+0

Jodaの時刻は、Javaの日付よりも日付時刻の方が比較的優れたライブラリです。あなたは私があなたのためにどのように問題を解決したかを見ることができます。 – Nishant

答えて

5

あなたがJodaTimeを使用することができた場合は、ここでは±6ヶ月の計算のためのコードは次のとおりです。

import org.joda.time.DateTime; 
    import org.joda.time.Months; 
    .... 
    .... 
    DateTime now = new DateTime(); 
    DateTime then = new DateTime().withDate(2011, 8, 1); 
    if(Math.abs(Months.monthsBetween(now, then).getMonths()) > 6){ 
     System.out.println("6 mo apart!"); 
     //your logic goes here 
    } 
+0

"monthsBetween"が何をしているのだろうか。私は今日と2011年8月1日を評価に使用し、彼らは6ヶ月間離れていると言いました。それは本当ではない。完全な月間は5ヶ月しかありません。 – lamwaiman1988

+0

ああ、私は間違いました。それは実際に動作します。そのために残念。 +1。 – lamwaiman1988

17

私はこの単純なロジックを試してみてください。

Calendar cal = Calendar.getInstance(); //Get current date/month i.e 27 Feb, 2012 
cal.add(Calendar.MONTH, -6); //Go to date, 6 months ago 27 July, 2011 
cal.set(Calendar.DAY_OF_MONTH, 1); //set date, to make it 1 July, 2011 

これが役に立ちます。

+1

ジョーダなどのない標準的なJavaソリューションのための親指アップ – Michal

2

はあなたの時間と日付のニーズに合わせてjoda-timeのようなライブラリを使用してください。私はあなたがこれを行うことができると思います:

new LocalDate()minusMonths(7)withDayOfMonth(1)

(任意の部分ヶ月をカバーするために7ヶ月... :)月の最初のエッジケースを残し...しかし、EH)

0

私は理解しているように、あなたはどの意志有用性を​​持っている必要があります可変日付が設定する参照日付の6ヶ月前かどうかをと決定します。この問題のコードスニペットを見てください。 java.util.Calendarを使用するだけで、他のライブラリを使用する必要はありません。ジャワに組み込まれて

import java.util.Calendar; 

public class Test 
{ 
    public static void main(String[] args) 
    { 
     Calendar cal1 = Calendar.getInstance(); 
     cal1.set(2012, 2, 27); 
     Calendar cal2 = Calendar.getInstance(); 
     cal2.set(2011, 8, 1); 
     boolean valid = isSixMonthsAgo(cal1, cal2); 
     System.out.println(valid); 
    } 

    public static boolean isSixMonthsAgo(Calendar referenceDate, Calendar dateToBeTested) 
    { 
     int year1 = referenceDate.get(Calendar.YEAR); 
     int month1 = referenceDate.get(Calendar.MONTH); 

     int year2 = dateToBeTested.get(Calendar.YEAR); 
     int month2 = dateToBeTested.get(Calendar.MONTH); 

     if ((year1 * 12 + month1) - (year2 * 12 + month2) > 6) 
      return true; 
     return false; 
    } 
} 
1

YearMonth

java.time.YearMonthクラスは、この作業が簡単になります。

現在の年月を取得します。これには、ゾーンごとに日付が地球の周りで変化する任意の瞬間のタイムゾーンが必要です。月の最初/最後の日に、その月はゾーンごとに世界中で変わる可能性があります。

YearMonth ymCurrent = YearMonth.now(ZoneId.of("America/Montreal") ); 

現在の月は定義上不完全であることがわかります。前の月に移動します。

YearMonth ymPrevious = ymCurrent.minusMonths(1) ; 

必要に応じてさらに6ヶ月前に移動します。

YearMonth ymSixMonthsMore = ymPrevious.minusMonths(6); 

そのYearMonthオブジェクト自体があなたのコードで役に立つかもしれません。あなたはこのクラスのこれらのオブジェクトをあなたのコードの周りに送ることができます。

月の最初の日が必要な場合は、質問してください。

LocalDate ld = ymSixMonthsMore.atDay(1);