我有一个独特的情况。 我正在研究一个旧的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);
}
感觉有点icky,因为在更新版本的JodaTime中, YearMonthDay
类中的所有内容都已被弃用,并被LocalDate
取代,遗憾的是我无法使用它。 有没有更好的方法可以做到这一点? 另外,我试图通过将DateTime
转换为YearMonthDay
来YearMonthDay
DateTime
的时间......是否有任何“陷阱”我缺少或应该注意到?
另外几个注意事项:我假设我已经对dateTime
参数进行了空检查,并且时区不应成为问题,因为应用程序中的所有时区都是GMT。 此外,我被允许使用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
的弃用说明说
使用具有更好内部实现的LocalDate
所以它可能是使用它并不完全错误 ,我不会认为你使用它会遇到任何错误。
我建议为该方法编写一个很好的( 参数化 ?)单元测试集,并验证YearMonthDay
的行为。 如果它似乎工作,那么继续它,如果它没有,然后尝试toString()
解决方法。