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

时间:2015-11-09 22:49:57

标签: java jodatime legacy

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

我工作的客户有一个包含Java 8的标准开发平台,以及用于早期Java版本的项目的JodaTime。因此,我坚持使用这个旧版本的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的时间......是否有任何"陷阱"我错过了或者应该知道吗?

补充说明:我假设我已经检查了dateTime参数,并且时区不应该是一个问题,因为所有时区都在申请是GMT。此外,我 am 允许使用Apache Commons和Guava库。

1 个答案:

答案 0 :(得分: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;
}

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

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

所以它可能不是错误使用它,我不会认为你使用它会遇到任何错误。

我建议为该方法编写一个很好的(parameterized?)单元测试集并验证YearMonthDay的行为。如果它似乎有效,那么请使用它,如果没有,请尝试toString()解决方法。