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
上的方法比较:isEqual
、isBefore
和 isAfter
。
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 时区。
我在 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
上的方法比较:isEqual
、isBefore
和 isAfter
。
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 时区。