找到最近的上一个日期

时间:2014-04-01 12:14:29

标签: java date datetime

我有一个日期列表和一个目标日期对象。我需要找到最近的上一个日期(在目标日期之前)。我已尝试过以下内容,但我认为它不会仅适用于之前的日期。

private Date getDateNearest(List<Date> dates, Date targetDate) {
    Date returnDate = targetDate;

    for (Date date : dates) {
        if (date.compareTo(targetDate) <= 0 && date.compareTo(returnDate) > 0) {
            returnDate=date;
        }
    }

    return returnDate;
} 

3 个答案:

答案 0 :(得分:1)

标准库单行

由于Date实现Comparable,这应该像

一样简单
Date previousDate = new TreeSet<Date>(dates).lower(targetDate);

显然,为了方便单线程,这会带来一些额外的开销。

来自Javadoc for lower()

  

返回此set中最大的元素,严格小于给定元素,如果没有这样的元素,则返回null。

修改:查看您的代码,如果它在集合中,您似乎也希望返回targetDate,这样您就可以使用floor(targetDate)

番石榴方法

使用Guava,这是一个更高性能的单行:

Date earlierDate = Ordering.natural().max(
     Iterables.filter(dates, Range.lessThan(targetDate)));

与纯Java方法不同,这不需要填充额外的数据结构,只需要一次传递列表。它会创建一个延迟填充的Iterable,其中只包含小于targetDate的日期,然后获取该可迭代的最大值。

同样,如果您希望它也接受targetDate,请使用Range.atMost代替Range.lessThan

答案 1 :(得分:0)

private Date getDateNearest(List<Date> dates, Date targetDate) {
    Date returnDate = null; // Nearest before.
    for (Date date : dates) {
        if (date.before(targetDate) || date.equals(targetDate) {
            if (returnDate == null || returnDate.before(date)) {
                returnDate = date;
            }
        }
    }
    return returnDate;
}

您的错误:在targetDate上初始化returnDate会得到无与伦比的最接近的最佳值。 记住,也许:

    return returnDate == null ? targetDate : returnDate;

BTW 4月1日? (编辑问题。)LOL

答案 2 :(得分:0)

这应该有帮助

private Date getDateNearest(List<Date> dates, Date targetDate) {
    Date returnDate = targetDate;
    long targetMillis = targetDate.getTime();
    long mindiff = Long.MAX_VALUE;        
    for (Date date : dates) {
        long dateMillis = date.getTime();
        long diff = Math.abs(dateMillis-targetMillis);
        if( diff < mindiff){
            mindiff = diff;
            returnDate = date;
        }
    }
    return returnDate;
}