使用旧版本的JodaTime检查DateTime是否在将来

Jam*_*unn 5 java legacy jodatime

我有一个独特的情况.我正在研究一个旧的WebLogic服务器上的遗留项目,它(A)不允许任何过去的Java 6,并且(B)使用旧版本的JodaTime(版本1.2,确切地说)污染类加载器.

我正在为之工作的客户端有一个标准开发平台,包括Java 8,以及JodaTime,用于存放在早期Java版本中的项目.因此,我坚持使用这个旧版本的JodaTime(310-Backport将是一个很好的解决方案,但我不允许使用它).

我需要创建一个实用程序方法来检查a 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);
}
Run Code Online (Sandbox Code Playgroud)

感觉有点icky,因为在最新版本的JodaTime中,YearMonthDay类中的所有内容都已被弃用并替换为LocalDate,遗憾的是我无法使用.有没有更好的方法可以做到这一点?此外,我试图DateTime通过将其转换为YearMonthDay...来消除时间...是否有任何"陷阱"我缺少或应该注意到?

另外两个注意事项:我假设我已经对dateTime参数进行了空检查,时区应该不是问题,因为应用程序中的所有时区都是GMT.此外,我允许使用Apache Commons和Guava库.

Ada*_*lik 1

由于您确定所有时区都是 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;
}
Run Code Online (Sandbox Code Playgroud)

您可以像这样稍微优化一下:

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;
}
Run Code Online (Sandbox Code Playgroud)

该解决方案将您与 JodaTime 稍微解耦,不会引入其他日期/时间类型。

另一方面,弃用说明YearMonthDay

使用 LocalDate ,它有更好的内部实现

因此,使用它可能并不完全错误,而且我不会假设您使用它会遇到任何错误。

我建议为该方法编写一组漂亮的(参数化?)单元测试并验证YearMonthDay. 如果它看起来有效,那么就继续它,如果不起作用,那么尝试toString()解决方法。