在Java 7中,两个日期之间的年数差异。

问题描述 投票:0回答:1

我有一个Liferay 6.2的maven项目。有一个需求,我必须比较存储在Oracle DB中的EndDate和当前日期。为了做到这一点,我创建了一个计划作业。实现了如下的receive(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 scheduled-tasks date-difference
1个回答
1
投票

该代码不推荐用于任何用Java 8或更高版本编译的应用程序。 这段代码只适用于Java 7。

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

0
投票

java.time

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

拉一个 LocalDate 对象的JDBC 4.2驱动。这个类取代了 java.sql.Date.

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

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

LocalDate ld = myJavaSqlDate.toLocalDate() ;

捕捉当前日期需要一个时区。对于任何一个特定的时刻,全球各地的日期都因时区不同而不同。例如,在日本东京可能是 "明天",而同时在美国俄亥俄州托莱多还是 "昨天"。

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

与以下方法比较 LocalDate: isEqual, isBeforeisAfter.

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

是你问的。

只比较这些日期的年份 并检查它们之间的差值是否大于4.

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

顺便说一下,你所需要的代表日期对象值的输出字符串是在ISO 8601标准中定义的。这个标准默认用于 java.time 类。不需要定义自定义格式模式。

问题中的代码还存在其他问题。

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

当你没有指定时区时,JVM的当前默认时区会被隐式应用。所以你对 new java.sql.Date() 在部署时可能会有不同的结果。最好明确指定你所希望的预期时区。

© www.soinside.com 2019 - 2024. All rights reserved.