【问题标题】:Date only comparison using "isBefore" in Java Joda Time在 Java Joda Time 中使用“isBefore”进行仅日期比较
【发布时间】:2012-03-07 21:52:50
【问题描述】:

有没有办法只比较具有 isBefore 函数的 DateTime 对象的日期?

例如,

DateTime start = new DateTime(Long.parseLong(<someInput>));
DateTime end   = new DateTime(Long.parseLong(<someInput>));

现在,当我这样做时,

while (start.isBefore(end)) { 
   // add start date to the list
   start = start.plusDays(1);
}  

这会导致不一致的行为(对于我的场景),因为它也考虑了时间,而我想要的只是使用 isBefore 比较日期。有什么办法可以做到吗?

请告诉我。

谢谢!

【问题讨论】:

    标签: java datetime jodatime


    【解决方案1】:

    这是一个相当古老的问题,但值得添加一个答案!考虑到我们在 Java 8 中对日期时间操作有很好的支持,Joda-time 现在不是首选。如果您仍然必须使用 joda-time,请在 LocalDate 类中使用 compareTo 方法。

    将此部分与另一个返回一个整数进行比较,该整数表示 命令。这些字段按从大到小的顺序进行比较。这 第一个不相等的字段用于确定结果。

    指定的对象必须是其字段类型的部分实例 匹配这个部分的。

    官方Java-doc可以在here找到。

    【讨论】:

      【解决方案2】:

      另一种策略是格式化。

      DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
      DateTime newStart = df.parse(start);
      DateTime newEnd = df.parse(end);
      
      while (newStart.isBefore(newEnd)) { 
        // add start date to the list
        newStart = newStart.plusDays(1);
      }    
      

      【讨论】:

      • 这是最接近我想要的。非常感谢您的建议!
      • 试试 df.parse(start.toString());
      【解决方案3】:

      如果您只想比较日期,您可能希望使用 LocalDate 类,而不是 DateTime。

      JodaTime 文档非常好:http://joda-time.sourceforge.net/apidocs/org/joda/time/LocalDate.html

      【讨论】:

      • 感谢您的回复。我想将 DateTime 存储在循环中,而不是将 DateTime 转换为 LocalDate,然后将 LocalDate 转换回 DateTime,我认为使用 DateFormatter 会更好。
      • 只要确保您在进入/离开夏令时时没有任何奇怪的行为!日期和时间通常比它们第一次出现时更棘手......
      • 我刚刚重新评估了我的应用程序的用例,看起来我最好还是使用 LocalDate。谢谢!
      • @TimGage 只是为了澄清。您对使用LocalDate 而不是DateTime 的评论。使用DateTime.. 是否有任何问题或任何开销?
      • 没有。我建议使用LocalDate 的唯一原因是该问题专门询问了有关比较日期组件的问题。使用DateTime 很好,但它是在建模一个不同的概念。选择适合您需求的产品很重要。
      【解决方案4】:

      切换到使用 LocalDate 而不是 DateTime。 JodaTime 中的概念是“部分”(参见 ReadablePartial 接口)。

      【讨论】:

      • 感谢您的回复。我只想在循环内存储 DateTime 格式。所以我想我会坚持乔治下面的建议。谢谢!
      【解决方案5】:

      您可以在解析后将DateTime 的时间设置为零(即午夜):

      // withTime sets hours, minutes, seconds, milliseconds
      DateTime start = new DateTime(Long.parseLong(<someInput>)).withTime(0, 0, 0, 0);
      DateTime end   = new DateTime(Long.parseLong(<someInput>)).withTime(0, 0, 0, 0);
      

      或使用其他 Joda Time 课程之一;不止DateTime!如果您只处理日期,您可能希望使用LocalDate 而不是DateTime。

      【讨论】:

      • 感谢您的回复!在仔细查看我的应用程序后,我想我会将其更改为 LocalDate 而不是 DateTime。谢谢!
      • 如果时区有包括午夜在内的夏令时间隔,则将时间设置为午夜将不起作用。调用 dayOfMonth().roundFloorCopy() 处理边缘情况。
      猜你喜欢
      • 2012-12-03
      • 1970-01-01
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多