Java 7 中两个日期之间的年份差异

Difference in years between two Dates in Java 7

我在 Liferay 6.2 中有一个 Maven 项目。有一个要求,我必须比较存储在 Oracle DB 中的 EndDate 和当前日期。为此,我创建了一个预定作业。我实现了receive(Message message)方法,就是下面这个:

@Override
public void receive(Message message) throws MessageListenerException {
    logger.info("Scheduler for checking dates on Penalties has started...");

    ApplicationContext applicationContext = ApplicationContextProvider.getApplicationContext();
    PenaltyService service = (PenaltyService)applicationContext.getBean("service");

    Date currentDate = new Date();

    SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd");
    try {
        currentDate = dateFormatter.parse(dateFormatter.format(new Date() ));
    } catch (ParseException e) {
        e.printStackTrace();
    }
    System.out.println("Current date is: " + currentDate);

    List<Penalty> penalties = service.findAll();
    for (Penalty penalty : penalties) {
        if (penalty.endDate == null) {
            System.out.println("No EndDate...");
        }
        else if (penalty.endDate.before(currentDate)) {
            penalty.setRevocationOrCompletion(1);
        }
        else if (penalty.endDate.compareTo(currentDate) == 0) {
            penalty.setRevocationOrCompletion(1);
        }
        System.out.println("-------------------" + penalty.getEndDate() + " " + penalty.isRevocationOrCompletion());
    }        
}

我在实施仅比较这些日期的年份并检查它们之间的差异是否大于 4 的方法时遇到了一些困难。 你能帮我解决这个问题吗?非常感谢任何建议。 先感谢您。

不建议将此代码用于使用 Java 8 或更高版本编译的任何应用程序。此代码仅适用于 Java 7

@SuppressWarnings( "deprecation" )
int penaltyYear = penalty.endDate.getYear();
int currentYear = currentDate.getYear();
if ((penaltyYear + 4) < currentYear) {
    // Invoke penalty
}

java.time

现代解决方案使用 JSR 310 中定义的 java.time classes。这些取代了可怕的日期时间 classes在问题中。

使用 JDBC 4.2 驱动程序从您的数据库中提取一个 LocalDate 对象。此 class 替换 java.sql.Date

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

如果给定一个 java.sql.Date 对象,使用添加到旧 classes 的新方法进行转换。

LocalDate ld = myJavaSqlDate.toLocalDate() ;

捕获当前日期需要时区。对于任何给定时刻,全球各地的日期因时区而异。例如,在日本东京可能是“明天”,而在美国俄亥俄州托莱多仍然是“昨天”。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now() ;

LocalDate 上的方法比较:isEqualisBeforeisAfter

if( Objects.isNull( ld ) ) {…}
else if ( ld.isBefore( today ) {…}
else if ( ld.isEqual( today ) {…}

你问过:

compare only the YEAR of those dates and check if the Difference between them is greater than 4.

int yearThen = ld.getYear() ;
int yearNow = ld.getYear() ;
if ( ( yearThen - yearNow ) > 4 ) {…}

顺便说一下,您想要的表示日期对象值的输出字符串在 ISO 8601 标准中定义。 java.time classes 中默认使用该标准。无需定义自定义格式模式。

Question中的代码还有其他问题。

不要多次询问当前日期。当跨越到另一个日期时,不同的调用可能会报告不同的日期。捕获当前日期一次并重复使用该 LocalDate 对象。

当您不指定时区时,将隐式应用 JVM 当前的默认时区。因此,您对 new java.sql.Date() 的调用在部署时的结果可能会有所不同。最好明确指定您的 desired/expected 时区。