Java比较两个日期年,月,日
问题描述:
我有一个方法来比较两个日期,以查看如果transactionDate在validFrom和validUntil之间的范围内,validFrom和validUnti的值为“2017-01-01 00:00:00”但由于转换为不同的时区,交易日期有时会有不同的时间。Java比较两个日期年,月,日
public boolean isDateWithinEmploymentDeploymentValidityPeriod(Date transcationDate, Parameter parameter) {
return transcationDate.compareTo(parameter.getValidFrom()) >= 0
&& (parameter.getValidUntil() == null || transcationDate.compareTo(parameter.getValidUntil()) <= 0);
}
,所以我需要比较仅比较年月日,不花时间考虑,这将是最有效的方式,而不转换日期的GregorianCalendar和歌厅年月日之间分别?
答
您可以使用日历和从年,月,日分开设置的其他参数为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);
答
LocalDate
我认为最简单的办法是转换为LocalDate
:
LocalDate validFrom = LocalDate.parse("2017-01-01 00:00:00", DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"));
LocalDate
类accepts parsing with a pattern包括小时,分钟和秒,它只是忽略这些值从字符串。
与validUntil
和交易日期相同。使用isBefore()
,isAfter()
,isEqual()
或compareTo()
来比较得到的LocalDate
实例。
答
如果您使用的是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);
}
小心:您需要在特定时区进行转换以获取日期字段。 '日期'没有时区。 –
什么是validFrom和validUntil?日期?字符串?你发布的代码有什么问题(假设你忘记在'transcationDate。(parameter.getValidUntil())'中粘贴'compareTo'? –
有什么问题是我不应该在比较时花费小时,它不应该依赖于时区,所以例如,如果validUntil是“2017-03-01 00:00:00”,transactionDate是“2017-03-01 10:00:00”,那么我应该返回它的有效期为true,validUntil和validFrom是Date对象 – Dadonis