我有一个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 8或更高版本编译的应用程序。 这段代码只适用于Java 7。
@SuppressWarnings( "deprecation" )
int penaltyYear = penalty.endDate.getYear();
int currentYear = currentDate.getYear();
if ((penaltyYear + 4) < currentYear) {
// Invoke penalty
}
现代的解决方案是使用 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
, isBefore
和 isAfter
.
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()
在部署时可能会有不同的结果。最好明确指定你所希望的预期时区。