Java比较两个日期的年份、月份和日期

4

我有一种方法可以比较两个日期,以查看transactionDate是否在validFrom和validUntil之间的范围内。validFrom和validUnti的值类似于"2017-01-01 00:00:00",但由于转换到不同的时区,交易日期有时会带有不同的小时数。

public boolean isDateWithinEmploymentDeploymentValidityPeriod(Date transcationDate, Parameter parameter) {
    return transcationDate.compareTo(parameter.getValidFrom()) >= 0
            && (parameter.getValidUntil() == null || transcationDate.compareTo(parameter.getValidUntil()) <= 0);
}

我需要比较的仅仅是年月日,不需要考虑时间,那么在不将日期转换为GregorianCalendar并分别获取年月日的情况下,最有效的方法是什么?


问题在于我不应该在比较时累积小时数,它不应该依赖于时区,因此例如如果validUntil是“2017-03-01 00:00:00”,而transactionDate是“2017-03-01 10:00:00”,我应该返回true,表示它在有效期内,validUntil和validFrom是日期对象。 - Dadonis
我不确定我理解你在最后一条评论中的例子的推理。 validUntil 是您日期期间的上限,对吗?那么为什么它应该返回一个晚于它的日期的 true 呢?或者这只是一个打字错误,也许?另外,您使用的是哪个版本的Java? - KevinLH
@klehelley他只想考虑年、月和日,忽略其他部分。这就是为什么他返回true的原因。 - Mirza
哦,对了,我有一瞬间忘记了那个。更糟糕的是,我刚才在我的评论末尾删除了最初的内容,因为那是关于完整日期而不仅仅是“日期”部分的。 - KevinLH
顺便说一下,我正在使用JAVA 8。 - Dadonis
显示剩余3条评论
3个回答

2

2
如果您使用的是Java < 8,很遗憾可能没有简单的答案(即您需要像在问题中提到的那样使用Calendar,或者依赖于第三方库,例如Joda-Time)。
希望您使用Java 8,这样我们就可以利用java.time包的好处。由于您只想比较日期(而不是时间),并且不关心时区,所以您需要使用的是java.time.LocalDate
// Ideally, instances of the java.time classes are used throughout
// the application making this method useless.
private LocalDate toLocalDate(Date date) {
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();
}

public boolean inRange(Date date, Date from, Date until) {
    return inRange(toLocalDate(date), toLocalDate(from), toLocalDate(until));
}

public boolean inRange(LocalDate date, LocalDate from, LocalDate until) {
    return !date.isBefore(from) && !date.isAfter(until);
}

0

你可以使用日历,并将除年、月和日以外的其他参数设置为0。

Calendar transactionCalendar= Calendar.getInstance();

Date transactionDate = ...;

transactionCalendar.setTime(transactionDate );
transactionCalendar.set(Calendar.HOUR_OF_DAY, 0);
transactionCalendar.set(Calendar.MINUTE, 0);
transactionCalendar.set(Calendar.SECOND, 0);
transactionCalendar.set(Calendar.MILLISECOND, 0);

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