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

小心:您需要在特定时区进行转换以获取日期字段。 '日期'没有时区。 –

+0

什么是validFrom和validUntil?日期?字符串?你发布的代码有什么问题(假设你忘记在'transcationDate。(parameter.getValidUntil())'中粘贴'compareTo'? –

+0

有什么问题是我不应该在比较时花费小时,它不应该依赖于时区,所以例如,如果validUntil是“2017-03-01 00:00:00”,transactionDate是“2017-03-01 10:00:00”,那么我应该返回它的有效期为true,validUntil和validFrom是Date对象 – Dadonis

您可以使用日历和从年,月,日分开设置的其他参数为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")); 

LocalDateaccepts 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); 
}