我有一个独特的情况。我正在处理旧 WebLogic 服务器上的遗留项目,该服务器 (A) 不允许 Java 6 之后的任何内容,并且 (B) 使用旧版本的 JodaTime(准确地说是 1.2 版)污染类加载器。
我工作的客户有一个标准开发平台,其中包括 Java 8 和 JodaTime,适用于卡在早期 Java 版本中的项目。因此,我一直在使用这个旧版本的 JodaTime(310-Backport 将是一个很好的解决方案,但我不允许使用它)。
我需要创建一个实用程序方法来检查 DateTime
是否在今天之后(无论时间如何)。 JodaTime 1.2 没有 LocalDate
,也没有像 now()
这样方便的静态工厂方法,所以我想到了这个:
public static boolean isAfterToday(DateTime dateTime) {
YearMonthDay date = new YearMonthDay(dateTime);
YearMonthDay today = new YearMonthDay();
return date.isAfter(today);
}
感觉有点恶心,因为在最近版本的 JodaTime 中,YearMonthDay
类中的所有内容都已被弃用并替换为 LocalDate
,遗憾的是我不能使用它.有没有更好的方法可以做到这一点?另外,我试图通过将 DateTime
转换为 YearMonthDay
来去除时间...是否有任何我遗漏或应该注意的“陷阱”的?
一些额外的注意事项:我假设我已经对 dateTime
参数进行了空检查,并且时区不应该成为问题,因为应用程序中的所有时区都是格林威治标准时间。此外,我被允许使用 Apache Commons 和 Guava 库。
最佳答案
因为您确定所有时区都是 GMT,所以最简单的实现是:
public static boolean isAfterToday(DateTime dateTime) {
String dateTimeStr = dateTime.toString("yyyy-MM-dd");
String nowStr = new DateTime().toString("yyyy-MM-dd");
return dateTimeStr.compareTo(nowStr) > 0;
}
你可以像这样稍微优化一下:
private static final DateTimeFormat yearMonthDay = DateTimeFormat.forPattern("yyyy-MM-dd");
public static boolean isAfterToday(DateTime dateTime) {
String dateTimeStr = yearMonthDay.print(dateTime);
String nowStr = yearMonthDay.print(new DateTime());
return dateTimeStr.compareTo(nowStr) > 0;
}
该解决方案以不引入其他日期/时间类型的方式将您与 JodaTime 稍微分离。
另一方面,YearMonthDay
的弃用说明说
Use LocalDate which has a much better internal implementation
所以使用它可能并不完全是错误,我不认为您在使用它时会遇到任何错误。
我建议为该方法编写一组不错的(parameterized?)单元测试并验证 YearMonthDay
的行为。如果它似乎有效,则继续使用它,如果无效,则尝试使用 toString()
解决方法。
关于java - 使用旧版本的 JodaTime 检查 DateTime 是否在未来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33619808/