【问题标题】:How to compare Joda DateTime objects with acceptable offset (tolerance)?如何将 Joda DateTime 对象与可接受的偏移量(公差)进行比较?
【发布时间】:2012-07-01 09:24:40
【问题描述】:

我想知道JodaTime 中是否有任何标准 API 来比较 2 个具有指定容差的 DateTime 对象? 我正在寻找一种最好使用Joda 标准API 的单线器。不适用于 this post 中的时间算术表达式。

理想情况下,应该是这样的:

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

谢谢!

【问题讨论】:

    标签: java date jodatime


    【解决方案1】:

    使用这个:

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

    【讨论】:

      【解决方案2】:

      这篇文章很旧,但我发现接受的解决方案中的行有点长,而且我发现没有比现有的更好的了。所以我做了一个为 Date 和 DateTime 包装它的小类:

      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))
      

      我发现这在需要验证创建日期的单元测试用例中非常有用。

      【讨论】:

      • 这看起来很方便。我唯一的批评是关于命名的一个小批评:我会将命名从“date...”更改为“datetime...”(例如“datetimesAreEqual”而不是“datesAreEqual”),以避免与错误命名的@987654324混淆@ 和 LocalDate。我也可以说“AreClose”而不是“AreEqual”和“IsCloseToNow”而不是“IsNow”。
      • "IsClose" 可能确实更清楚。对于 DateTime,我不确定。由于这些方法都以 Date 和 DateTime 作为参数,所以我认为 Date 更清晰。虽然,该类可以重命名为 DateTimeUtils。我会编辑帖子。
      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 2020-07-08
      相关资源
      最近更新 更多