2012-07-01 4 views
6

JodaTimeに標準APIがありますか?2 DateTimeのオブジェクトと指定の許容差を比較してください。 私は、好ましくはJoda標準APIを使用して1ライナーを探しています。 this postのような時間的表現ではない。Joda DateTimeオブジェクトを許容オフセット(公差)と比較するにはどうすればよいですか?

理想的には、それはのようになります。

boolean areNearlyEqual = SomeJodaAPIClass.equal(dt1, dt2, maxTolerance); 

ありがとう!

答えて

8

使用この:

new Duration(dt1, dt2).isShorterThan(Duration.millis(maxTolerance)) 
5

この投稿は古いですが、私は少し長い受け入れ、溶液中の行を見つけて、私が存在するもので、より良い何も見つかりませんでした。だから私は、日付や日時のためにそれをラップ小さなクラスをしました:

public class DateTimeUtils 
{ 
    public static boolean dateIsCloseToNow(Date dateToCheck, 
              Duration tolerance) 
    { 
     return dateIsCloseToNow(new DateTime(dateToCheck), tolerance); 
    } 

    public static boolean dateIsCloseToNow(DateTime dateToCheck, 
              Duration tolerance) 
    { 
     return datesAreClose(dateToCheck, DateTime.now(), tolerance); 
    } 

    public static boolean datesAreClose(Date date1, 
             Date date2, 
             Duration tolerance) 
    { 
     return datesAreClose(new DateTime(date1), new DateTime(date2), tolerance); 
    } 

    public static boolean datesAreClose(DateTime date1, 
             DateTime date2, 
             Duration tolerance) 
    { 
     if (date1.isBefore(date2)) { 
      return new Duration(date1, date2).isShorterThan(tolerance); 
     } 
     return new Duration(date2, date1).isShorterThan(tolerance); 
    } 

ので、この行:

new Duration(date.getTime(), System.currentTimeMillis()).isShorterThan(Duration.standardSeconds(5) 

は次のようになります。

DateUtils.dateIsCloseToNow(date, Duration.standardSeconds(5)) 

私はユニットテストケースではそれが本当に有用であることが判明しました私は作成日を検証する必要がありました。

+2

これはかなり便利です。私の唯一の批判は、命名についての小さな批判です。私は、命名を「日付...」から「datetime ...」(「datesAreEqual」ではなく「datetimesAreEqual」など)に変更します。 .util.Date'と 'LocalDate'を使用します。私はまた、 'IsNow'ではなく 'AreEqual'と 'IsCloseToNow'ではなく、 'AreClose'と言うかもしれません。 –

+0

"IsClose"は実際にはもっと明白かもしれません。 DateTimeについては、わからない。メソッドは両方ともDateとDateTimeをパラメータとして取るので、Dateはもっと明確だと私は思う。ただし、クラスの名前をDateTimeUtilsに変更できます。私は投稿を編集します。 – FredBoutin

関連する問題