2017-10-08 21 views
0

私は今月、dueDate(フォームを記入する)を持つユーザーのリストを取得する必要のあるアプリケーションを構築しています。そして、これらのユーザーをa日以内にdueDateを持つユーザーにフィルタリングします週間。Java - 1週間以内のブール

はそう

if(isWithinAWeek(dueData)){ 
//alarm - 1 
} 
else{ 
//alarm - 0 
} 

---私は

public static Boolean isWithinAWeek(Date date1){ 
    Date c1 = setTimeInDays(date1, 7);  
    if(c1.after(date1)){ 
     return true; 
    } 
    return false; 
} 


public static Date setTimeInDays(Date startingTime, Integer days){ 
    Calendar c = Calendar.getInstance(); 
    c.setTime(startingTime); 
    c.add(Calendar.DATE, days);//a day in the future or past 
    return c.getTime(); 
} 
+0

コードが正しいかどうかを確認する最も良い方法は、単体テストケースを書いたり、異なる値を渡してチェックすることです。物事が期待どおりに機能しない場合は、私たちに知らせてください:) – Nishit

答えて

1

あなたは、それは常にtrueになります書いたように、条件が正しいこのブールisWithinAWeek方法を確実に助けが必要。

public static boolean isWithinAWeek(Date date) { 
    return setTimeInDays(date, 7).after(date); 
} 

これは単に短く、あなたと同等です: それは私がそれを簡略化するかどうかを確認する方が簡単です。 ご覧のとおり、「日付+ 7日が経過してもtrueを返します」というのは効果的です。 常に真実です。

あなたはになりました+ 7日が ないdate + 7日、date後にあるかどうかを確認したい:

public static boolean isWithinAWeek(Date date) { 
    return setTimeInDays(new Date(), 7).after(date); 
} 

値は決してので、私はまた 、Booleanからbooleanに戻り値の型を変更nullになります。 そしてからplusDays、 という名前に変更することをお勧めします。近年のバージョンのJavaの では現代のAPIに似ています(覚えていればわかるようになります)。

0

Periodを使用すると、これをかなり簡単に計算できます。ここでは例です:

public static boolean isWithinAWeek(LocalDate dueDate) { 
    boolean result = false; 
    LocalDate today = LocalDate.now(); 
    System.out.println("Today is " + today); 
    System.out.println("Due Date is " + dueDate); 

    Period p = Period.between(today, dueDate); 

    System.out.println("The period between these two is " + p.getYears() + " years, " + p.getMonths() +" months, " + p.getDays() + " days."); 

    // do you want to measure a week backwards? If so, change "p.getDays() >= 0" to "p.getDays() >= -7" 
    if (p.getYears() == 0 && p.getMonths() == 0 && p.getDays() >= 0 && p.getDays() <= 7) { 
     System.out.println(String.format(" └─ Yes, %1$s is within a week from %2$s.", dueDate, today)); 
     result = true; 
    } else { 
     System.out.println(String.format(" └─ No, %1$s is NOT within a week from %2$s.", dueDate, today)); 
     result = false; 
    } 

    return result; 
} 

は、以下のようにして、これを呼び出す:

public static void main(String[] args) { 

    LocalDate due; 

    // 7 days from now 
    due = LocalDate.of(2017, Month.OCTOBER, 15); 
    System.out.println(isWithinAWeek(due)); 

    System.out.println(); 

    // 8 days from now 
    due = LocalDate.of(2017, Month.OCTOBER, 16); 
    System.out.println(isWithinAWeek(due)); 

    System.out.println(); 

    // a month from now 
    due = LocalDate.of(2017, Month.NOVEMBER, 8); 
    System.out.println(isWithinAWeek(due)); 

    System.out.println(); 

    // 5 days ago 
    due = LocalDate.of(2017, Month.OCTOBER, 3); 
    System.out.println(isWithinAWeek(due)); 

} 

には、次のものが得られます:

Today is 2017-10-08 
Due Date is 2017-10-15 
The period between these two is 0 years, 0 months, 7 days. 
    └─ Yes, 2017-10-15 is within a week from 2017-10-08. 
true 

Today is 2017-10-08 
Due Date is 2017-10-16 
The period between these two is 0 years, 0 months, 8 days. 
    └─ No, 2017-10-16 is NOT within a week from 2017-10-08. 
false 

Today is 2017-10-08 
Due Date is 2017-11-08 
The period between these two is 0 years, 1 months, 0 days. 
    └─ No, 2017-11-08 is NOT within a week from 2017-10-08. 
false 

Today is 2017-10-08 
Due Date is 2017-10-03 
The period between these two is 0 years, 0 months, -5 days. 
    └─ No, 2017-10-03 is NOT within a week from 2017-10-08. 
false 
0

java.time

あなたが面倒な古い日付を使用しています業界標準のjava.timeクラスに取って代わられています。

java.util.Dateというコードを入力する場合は、古いクラスに新しいメソッドを追加してInstantに変換してください。

Instant instant = myJavaUtilDate.toInstant() ; 

LocalDateのクラスを使用してください。

あなたのコードは、タイムゾーンの重要な問題を無視していました。特に指定しない場合、JavaはJVMの現在のデフォルトのタイムゾーンを暗黙的に使用します。明示的にすることをお勧めします。

ZoneId z = ZoneId.of("America/Montreal") ; 

日付のみの値を抽出し、その日付を決定するタイムゾーンを割り当てます。特定の瞬間には、ゾーンごとに時刻と日付が世界中で異なります。

ZonedDateTime zdt = instant.atZone(z) ; 
LocalDate target = zdt.toLocalDate() ; 

今日の日付と翌週と翌月を取得します。

LocalDate today = LocalDate.now(z) ; 
LocalDate nextWeek = today.plusDays(7) ; 
LocalDate nextMonth = today.plusMonths(1) ; 

を比較してください。

Boolean isInNextWeek = (! target.isBefore(today)) && target.isBefore(nextWeek) ; 
Boolean isInNextMonth = (! target.isBefore(today)) && target.isBefore(nextMonth) ; 
関連する問題