Java最近本地日期

Java最近本地日期,java,localdate,Java,Localdate,我有一个LocalDate对象列表(dates),我想在列表中找到最接近给定日期的条目(milestoneDate) 最接近表示日期可以在milestoneDate之前或之后,但差异最小。例如,milestoneDate前一天的某物将比milestoneDate后两天的某物更接近 到目前为止,我最好的办法是将datestoepochssecond中的值转换为绝对值,然后获得该值与milestoneDate的toepochssecond之间的差值,并选择最小值 long milestoneSeco

我有一个LocalDate对象列表(
dates
),我想在列表中找到最接近给定日期的条目(
milestoneDate

最接近表示日期可以在
milestoneDate
之前或之后,但差异最小。例如,
milestoneDate
前一天的某物将比
milestoneDate
后两天的某物更接近

到目前为止,我最好的办法是将
dates
toepochssecond中的值转换为绝对值,然后获得该值与
milestoneDate
toepochssecond
之间的差值,并选择最小值

long milestoneSeconds = milestoneDate.atStartOfDay().toEpochSecond(ZoneOffset.UTC);

return dates.stream().sorted((x, y) -> {
            long xDiff = Math.abs(x.atStartOfDay().toEpochSecond(ZoneOffset.UTC) - milestoneSeconds);
            long yDiff = Math.abs(y.atStartOfDay().toEpochSecond(ZoneOffset.UTC) - milestoneSeconds);
            return (int) (xDiff - yDiff);
        }).findFirst();

虽然我怀疑这会起作用,但感觉有点沉重。有没有更优雅的方法可以做到这一点?

您可以直接在列表中找到里程碑日期和每个日期之间的天数。不需要转换为一秒

dates.stream().min(Comparator.comparingLong(
    x -> Math.abs(ChronoUnit.DAYS.between(x, milestoneDate))
));
请注意,在某些情况下,可能有两个日期与里程碑日期同样接近-一个在里程碑日期之前,一个在里程碑日期之后。如果您在这种情况下有选择哪一个的首选项,您可以在比较器中添加
然后比较

// gets the date before
dates.stream().min(Comparator.<LocalDate>comparingLong(
    x -> Math.abs(ChronoUnit.DAYS.between(x, milestoneDate))
).thenComparing(Comparator.naturalOrder()));

// gets the date after
dates.stream().min(Comparator.<LocalDate>comparingLong(
    x -> Math.abs(ChronoUnit.DAYS.between(x, milestoneDate))
).thenComparing(
    Comparator.<LocalDate>naturalOrder().reversed()
));
//获取之前的日期
dates.stream().min(Comparator.comparingLong(
x->Math.abs(ChronoUnit.DAYS.between(x,milestoneDate))
).然后比较(Comparator.naturalOrder());
//获取之后的日期
dates.stream().min(Comparator.comparingLong(
x->Math.abs(ChronoUnit.DAYS.between(x,milestoneDate))
).然后比较(
Comparator.naturalOrder().reversed()
));

有点遗憾的是,Java无法推断类型参数:(

也可能有关系。OP应该相应地解决或合并任何关系破坏规则。@Atmas感谢您提醒我!我通常会在日期和时间上考虑很多边缘案例,但这次我没有想到这一点,因为某些原因。很高兴我能帮到您!我相信您最终会找到它。为什么要对整个流进行排序?
Stream
有一个
min
方法,我认为这个方法很好。@OleV.V.你是对的,它更简洁。虽然我确实想知道
是否排序(…)。findFirst()
将是O(n),就像
min
一样,因为流是惰性地计算的。。。