You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Liferay 6.2 Maven项目中Java 7实现日期年份差大于4的判断

嘿,我来帮你搞定这个年份比较的问题!

首先,要实现仅比较两个日期的年份并判断差值是否大于4,我们可以借助Java的Calendar类(因为Liferay 6.2通常基于Java 6,这个类兼容性最好)来提取年份,然后计算差值。下面是具体的实现方案,直接整合到你的现有定时任务代码里就行:

步骤1:简化当前日期处理(可选)

你之前的代码里把currentDate格式化为当天的0点,但如果只需要比较年份的话,这一步其实是多余的,可以直接删掉,节省代码复杂度。

步骤2:修改循环中的年份判断逻辑

在遍历penalties的循环里,替换或新增年份判断的逻辑:

@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"); 

    // 直接获取当前日历实例,用于提取年份
    Calendar currentCal = Calendar.getInstance();
    int currentYear = currentCal.get(Calendar.YEAR);

    List<Penalty> penalties = service.findAll(); 
    for (Penalty penalty : penalties) { 
        if (penalty.endDate == null) { 
            System.out.println("No EndDate..."); 
        } else { 
            // 把penalty的endDate转成Calendar,提取年份
            Calendar endDateCal = Calendar.getInstance();
            endDateCal.setTime(penalty.endDate);
            int endYear = endDateCal.get(Calendar.YEAR);

            // 计算年份差值,判断是否大于4
            int yearDiff = currentYear - endYear;
            if (yearDiff > 4) {
                penalty.setRevocationOrCompletion(1);
                System.out.println("Penalty ID: " + penalty.getId() + " | End year (" + endYear + ") is over 4 years before current year (" + currentYear + ")");
            }

            // 如果你还要保留原来的"EndDate在当前日期之前/等于则设置为1"的逻辑,就解开下面的注释
            /*
            else if (penalty.endDate.before(new Date()) || penalty.endDate.compareTo(new Date()) == 0) {
                penalty.setRevocationOrCompletion(1);
            }
            */
        } 
        System.out.println("-------------------" + penalty.getEndDate() + " " + penalty.isRevocationOrCompletion()); 
    } 
}

注意事项

  • 时区问题:如果你的Oracle数据库存储的日期是UTC时区,而服务器用的是其他时区,记得给Calendar设置对应时区,避免年份计算错误:
    currentCal.setTimeZone(TimeZone.getTimeZone("UTC"));
    endDateCal.setTimeZone(TimeZone.getTimeZone("UTC"));
    
  • Java版本兼容:如果你的项目已经升级到Java 8+,可以用更简洁的LocalDate类来处理,代码会更易读:
    LocalDate currentLocalDate = LocalDate.now();
    int currentYear = currentLocalDate.getYear();
    
    LocalDate endLocalDate = penalty.endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    int endYear = endLocalDate.getYear();
    
    if (currentYear - endYear > 4) {
        penalty.setRevocationOrCompletion(1);
    }
    

这样就能轻松实现你要的年份差判断啦!

内容的提问来源于stack exchange,提问作者Nikos Krous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:52:27