我应该使用 Java 日期和时间类,还是使用第三方库,比如 Joda Time?

我正在创建一个基于网络的系统,将在世界各国使用。必须存储的一种数据类型是日期和时间。

与第三方库(如 乔达时间)相比,使用 Java 日期和时间类有哪些优点和缺点?我想这些第三方库的存在是有原因的,但我自己从来没有真正比较过它们。

30065 次浏览

那么,除非您打算等待 Java8,希望它们将实现 更好的空气污染指数来操作日期和时间,否则,请使用 Joda 时间。这样既节省时间又避免了许多麻烦。

答案是: 看情况了

JODA (和 JSR-310)是一个功能齐全的日期/时间库,包括对多日历系统的支持。

就我个人而言,我发现 JODA 对于我所需要的复杂性来说是一个太远的步骤。标准 java DateCalendar类中的两个主要错误是:

  1. 它们是易变的
  2. 他们混合了一年一个月一天的概念从即时

尽管 JODA 解决了这些问题,但您会发现很容易为 YearMonthDayInstant滚动自己的类,它们都使用 Java 类进行实际的“日历”计算。这样你就不必熟悉一个大于100个类的 API,一个不同的格式化/解析机制等等。

当然,如果你确实需要不同时间表的完整表示(比如希伯来语) ,或者希望能够定义自己想象中的日历系统(比如你正在写的游戏) ,那么 JODA 或 JRS-310可能适合你。如果答案是否定的,那么我建议你可以自己动手。

JSR-310规范的领导者是 Stephen Colebourne,他在第一位编写了 JODA,因此逻辑上 更换 JODA 也是如此。

编辑: 既然 Java8已经发布了,如果你可以使用它,那就这样做吧!在我看来,java.time甚至比 Joda Time 还要干净。但是,如果您在 Java-8之前就遇到了困难,请继续阅读..。

Max 问了利用 Joda 的利弊。

优点:

  • 效果很好。我强烈怀疑焦达的 bug 要比标准的 Java 库少得多。由于设计的原因,Java 库中的一些 bug 很难(如果不是不可能的话)修复。
  • 它旨在鼓励你以正确的方式思考日期/时间的处理——将“当地时间”(例如“无论我在哪里,早上7点叫醒我”)和“瞬间”(“我在太平洋标准时间下午3点给詹姆斯打电话; 他所在的地方可能不是下午3点,但它是同一个瞬间”)的概念分开
  • 我相信这使得更新时区数据库变得更加容易,因为 是的变化相对较频繁
  • 它有一个很好的不可变的故事,这使生活中的 很多更容易输入法。
  • 从不可变性出发,所有格式化程序都是线程安全的,这很好,因为几乎 一直都是都希望通过应用程序重用单个格式化程序
  • 您将在学习 Java8中的 java.time方面有一个领先优势,因为它们至少在某种程度上是相似的

缺点:

  • 这是另一个需要学习的 API (尽管文档相当不错)
  • 这是另一个要构建和部署的库
  • 当您使用 Java8时,仍然有一些工作需要迁移您的技能
  • 过去我没有有效地使用 DateTimeZoneBuilder,但这是一个罕见的 非常用例。

为了回应 oxbow _ lake 关于有效构建自己的小 API 的想法,以下是我对为什么这是一个坏主意的看法:

  • 这是工作,为什么还要工作呢?
  • 新加入您的团队的人更可能熟悉 Joda,而不是您自己开发的 API
  • 除了最简单的用法之外,你很可能会在其他方面出错... ... 即使你最初的 好好想想只需要简单的功能,这些东西也会变得越来越复杂,一次一点。日期和时间的操作是 用力做正确的。此外,内置的 Java API 很难正确地使用 使用——只要看看日历 API 的日期/时间算法是如何工作的规则就知道了。在这些基础上构建任何东西都是一个糟糕的主意,而不是从使用设计良好的库开始。

这完全取决于你如何处理这些日期。如果您只是持久化它们,那么 Java 内置的 Dates 可能会满足您的所有要求。然而,如果您正在进行大量的时间日期操作,那么使用 Joda 可能会更好。

您应该使用 Joda-Time 库,因为:

  1. Joda-Time 支持 ISO8601国际编码标准,这是
    日期表示法。
  2. 在 Joda-Time,加减一天/月/年比 java.util.date 更容易。
  3. 在 Joda-Time,通过给定日期进行初始化要容易得多。
  4. Joda-Time 也支持时区。
  5. Joda-Time 有一个更好的内置解析。像“2014-02-31”这样的错误日期被作为错误抛出: < code > Exception in thread“ main” 异常: 无法解析“2014-02-31”: DayOfMonth 的值31必须在范围[1,28]内。

有关详情,请参阅此网页: Http://swcodes.blogspot.com/