2017-02-24 35 views
4

私は、transactionDateがvalidFromとvalidUntilの間にあるかどうかを調べるために2つの日付を比較する方法があります。validFromとvalidUntiの値は "2017-01-01 00:00:00"取引日は時々異なるタイムゾーンへの変換のために異なる時間で来る。Javaの比較2つの日付年月日

public boolean isDateWithinEmploymentDeploymentValidityPeriod(Date transcationDate, Parameter parameter) { 
    return transcationDate.compareTo(parameter.getValidFrom()) >= 0 
      && (parameter.getValidUntil() == null || transcationDate.compareTo(parameter.getValidUntil()) <= 0); 
} 

ので、私は唯一の年月日を比較比較する必要があるとのGregorianCalendarに日付を変換し、別途年間の月と日をgetingすることなく、最も効率的な方法であるもの、時間を考慮していませんか?

+0

注意:日付フィールドを取得するには、特定のタイムゾーンで変換を行う必要があります。 「日付」にはタイムゾーンがありません。 –

+0

validFromとvalidUntilとは何ですか?日付?文字列?あなたが投稿したコードに何が問題なのですか?(あなたが 'transcationDate(parameter.getValidUntil())'に 'compareTo'を貼りつけるのを忘れたと仮定した場合)? –

+0

何が間違っているのは、たとえば、validUntilが "2017-03-01 00:00:00"で、transactionDateが "2017-03-01 10:00:00"の場合、有効期間内であることをtrueに戻し、validUntilとvalidFromはDateオブジェクト – Dadonis

答えて

0

あなたはカレンダーを使用し、0

Calendar transactionCalendar= Calendar.getInstance(); 

Date transactionDate = ...; 

transactionCalendar.setTime(transactionDate); 
transactionCalendar.set(Calendar.HOUR_OF_DAY, 0); 
transactionCalendar.set(Calendar.MINUTE, 0); 
transactionCalendar.set(Calendar.SECOND, 0); 
transactionCalendar.set(Calendar.MILLISECOND, 0); 
2

LocalDate

に年、月、日から離れて他のパラメータを設定することができ、私は簡単な解決策はLocalDateに変換することであると思う:

LocalDate validFrom = LocalDate.parse("2017-01-01 00:00:00", DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")); 

LocalDateクラスaccepts parsing with a patternには、時、分、秒が含まれていますが、文字列。

validUntilと取引日と同じにしてください。結果のLocalDateインスタンスをisBefore(),isAfter(),isEqual()またはcompareTo()を使用して比較します。

2

Java < 8を使用していた場合、残念なことに単純な答えはありませんでした。つまり、あなたの質問に答えてCalendarを使用するか、Joda-Timeのようなサードパーティのライブラリを使用する必要があります) 。

うまくいけば、Java 8を使用して、java.timeパッケージの良さを活かしてください。あなたは日付(時間ではなく)を比較し、タイムゾーンを気にしないので、使用するものはjava.time.LocalDateです。

// Ideally, instances of the java.time classes are used throughout 
// the application making this method useless. 
private LocalDate toLocalDate(Date date) { 
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate(); 
} 

public boolean inRange(Date date, Date from, Date until) { 
    return inRange(toLocalDate(date), toLocalDate(from), toLocalDate(until)); 
} 

public boolean inRange(LocalDate date, LocalDate from, LocalDate until) { 
    return !date.isBefore(from) && !date.isAfter(until); 
}