如何比较具有可接受偏差(容差)的Joda DateTime对象?

6
我想知道在JodaTime中是否有标准API可以比较两个指定误差范围内的DateTime对象? 我希望能够使用Joda标准API来实现一行代码。不要使用时间算术表达式,如这篇文章中所述。 理想情况下,它应该是这样的:
boolean areNearlyEqual = SomeJodaAPIClass.equal(dt1, dt2, maxTolerance);

谢谢!

2个回答

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
看起来非常方便。我唯一的批评是关于命名的小问题:我会将命名从“date…”更改为“datetime…”(例如,“datetimesAreEqual”而不是“datesAreEqual”),只是为了避免与错误命名的java.util.DateLocalDate混淆。我也可能会说“AreClose”而不是“AreEqual”,并且“IsCloseToNow”而不是“IsNow”。 - Basil Bourque
"IsClose" 可能更清晰明了。至于 DateTime,我不确定。由于这两种方法都接受 Date 和 DateTime 作为参数,我认为 Date 更清晰。不过,类的名称可以改为 DateTimeUtils。我会编辑帖子。 - FredBoutin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接