【问题标题】:Check if DateTime is in the future with old version of JodaTime使用旧版本的 JodaTime 检查 DateTime 是否在未来
【发布时间】:2015-11-09 22:49:56
【问题描述】:

我有一个独特的情况。我正在处理一个旧 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);
}

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

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

【问题讨论】:

    标签: java jodatime legacy


    【解决方案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() 解决方法。

    【讨论】:

    • 有趣。我以前没有想到比较字符串表示。如果不填充年份,这将在公元 1000 年之前或公元 9999 年之后的大多数年份产生不正确的结果,但我并不担心。
    猜你喜欢
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 2019-09-04
    • 2013-10-02
    • 2012-06-11
    • 2013-07-29
    相关资源
    最近更新 更多