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

问题描述 投票:5回答:1

我有一个独特的情况。 我正在研究一个旧的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转换为YearMonthDayYearMonthDay DateTime的时间......是否有任何“陷阱”我缺少或应该注意到?

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

java jodatime legacy
1个回答
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

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

我建议为该方法编写一个很好的( 参数化 ?)单元测试集,并验证YearMonthDay的行为。 如果它似乎工作,那么继续它,如果它没有,然后尝试toString()解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.