2009-05-21 12 views
2

Javaでは、特定の日付が今日の日付から1年以内であるかどうかを調べるにはどうすればよいですか?日付がJavaの今日の日付の1年前であるかどうかを調べる方法

私は以下がありますが、これが最善のアプローチであるかどうかはわかりません。

String date = "01/19/2005"; 
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
    Date lastExamTakenDate = null; 
    Calendar todaysDateMinus1Year = Calendar.getInstance(); 
    todaysDateMinus1Year.add(Calendar.YEAR, -1); 

    if (date!=null) 
    { 
     try { 
      lastExamTakenDate = df.parse(date); 
      if (lastExamTakenDate.before(todaysDateMinus1Year.getTime())) 
       hasToTakeExam = true; 
     } catch (ParseException ex) { 
      //exception 
     } 

    } 
+0

これは正しく動作しますか?コード構造ビューパイントから変更することがいくつかあります。まず、日付の先頭を解析し、解析できない場合はカレンダーを作成しないでください。次に、正確に1年(5月21日午後5時13分EST)か、カレンダーの時間/分/秒の部分を0にするかどうかを検討します – kdgregory

答えて

1

日付オブジェクトでgetTime()を呼び出すと、エポック(jan 1. 1970)からのミリ秒で長さが返されます。日付が1年前であるかどうかをチェックするのは、1年前の日付を持つ1つの日付オブジェクトを作成し、長い値(someDate> aYearAgo)を比較するという単純な問題です。また、カレンダーオブジェクトでafter()メソッドを使用することもできます。 1年前の値を持つカレンダー/日付オブジェクトを作成するには、calObj.add(Calendar.YEAR、-1)を使用できます。

1

私はこのようなことがあなたに暦日の始まりを与えてくれると信じています。そうすれば、時刻は重要ではありません。

GregorianCalendar calToday = new GregorianCalendar(); 
GregorianCalendar oneYearAgoTodayAtMidnight = new GregorianCalendar(calToday.get(Calendar.YEAR) - 1, calToday.get(Calendar.MONTH), calToday.get(Calendar.DATE)); 
1

このアプローチは閏年年(および他のカレンダーに起因奇妙)を無視しますが、非常に簡単です:

public boolean isWithinAYear(Date inputDate) { 
    Date d = new Date() // Get "now". 
    long dLong = d.getTime(); 
    // You could multiply this next line out and use a single constant, 
    // I didn't do that for clarity (and the compiler will optimize it 
    // out for us anyhow.) 
    long oneYearAgo = dLong - (365 * 24 * 60 * 60 * 1000); 

    return inputDate.getTime() > oneYearAgo; 
} 

てGregorianCalendarを使用してあなたのソリューションは、技術的に正しいです。

0

このwoksは完璧です。

パブリッククラスX {ジャワにバンドル

public static Date date ; 

public static Date date1 ; 


/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    Calendar cal = Calendar.getInstance(); 
cal.add(Calendar.YEAR, 0); 

    boolean time; 

date = cal.getTime(); 
    System.out.println(date); 
time = withinYear(date); 

    System.out.println(time); 

} 


private static boolean result; 
public static boolean withinYear(Date inputDate) 
{ 
    Calendar todaysDateMinus1Year = Calendar.getInstance(); 
todaysDateMinus1Year.add(Calendar.YEAR, -1); 


date1 = todaysDateMinus1Year.getTime(); 

if (inputDate.before(date1)) 
      result= true; 
      return result; 

} 
2

java.util.Date & .Calendarクラスが悪名高い厄介です。それらを避けてください。 Joda-TimeまたはJava 8にバンドルされている新しいjava.timeパッケージ(およびJoda-Timeに触発されたもの)を使用してください。

ジョダタイム

あなたが唯一の時間またはタイムゾーンのない日付にしたい特定されている場合は、(ジョダ-時間とjava.timeの両方で見られる)LocalDateクラスを使用します。

現在の日付を尋ねるときにタイムゾーンを使用することに注意してください。日付はあなたが現時点でどこにいるのかによって異なります。日付を指定しないと、JVMのデフォルトのタイムゾーンが使用されます。一般的に指定する方が良い。

Joda-Time 2.3を使用したコードの例を次に示します。ダンプコンソールに

String input = "01/19/2005"; 
DateTimeFormatter formatter = DateTimeFormat.forPattern("MM/dd/yyyy"); 
LocalDate localDate = LocalDate.parse(input, formatter); 
DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
LocalDate now = LocalDate.now(timeZone); 
LocalDate yearAgo = now.minusYears(1); 
boolean withinYearAgo = ((localDate.isAfter(yearAgo)) & (localDate.isBefore(now))); 

...

実行
System.out.println("input: " + input); 
System.out.println("localDate: " + localDate); 
System.out.println("now: " + now); 
System.out.println("yearAgo: " + yearAgo); 
System.out.println("withinYearAgo: " + withinYearAgo); 

...

input: 01/19/2005 
localDate: 2005-01-19 
now: 2014-04-10 
yearAgo: 2013-04-10 
withinYearAgo: false 

あなたがのためにテストを追加する「またはに等しい」最後の内」のあなたの定義に依存するかもしれません年"。

関連する問題