147

我正在创建一个基于 Web 的系统,该系统将在世界各地的国家/地区使用。必须存储的一类数据是日期和时间。

与Joda time等 3rd 方库相比,使用 Java 日期和时间类的优缺点是什么?我想这些第三方库的存在是有充分理由的,但我自己从来没有真正比较过它们。

4

5 回答 5

197

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

Max 询问了使用 Joda 的利弊……

优点:

  • 它工作,非常好。我强烈怀疑 Joda 中的错误比标准 Java 库要少得多。由于设计原因,Java 库中的一些错误很难(如果不是不可能的话)修复。
  • 它旨在鼓励您以正确的方式思考日期/时间处理 - 将“本地时间”的概念(例如“无论我在哪里,早上 7 点叫醒我”)和即时时间(“我正在打电话给 Ja​​mes太平洋标准时间下午 3 点;他所在的位置可能不是下午 3 点,但它是同一时刻”)
  • 我相信它可以更容易地更新时区数据库,它确实会相对频繁地更改
  • 它有一个很好的不变性故事,这使IME 的生活变得更加轻松
  • 从不变性开始,所有格式化程序都是线程安全的,这很棒,因为您几乎总是希望通过应用程序重用单个格式化程序
  • 您将在学习java.timeJava 8 方面占得先机,因为它们至少有些相似

缺点:

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

为了响应 oxbow_lakes 有效构建自己的小型 API 的想法,以下是我对为什么这是一个坏主意的看法:

  • 这是工作。为什么已经为你完成了工作?
  • 你团队的新人更可能熟悉 Joda,而不是你自己开发的 API
  • 除了最简单的用途之外,你很可能会弄错......即使你最初认为你只需要简单的功能,这些东西也会变得越来越复杂,一次一点点。日期和时间操作很难正确完成。此外,内置的 Java API 很难正确使用- 只需查看日历 API 的日期/时间算法如何工作的规则即可。在这些之上构建任何东西都是一个坏主意,而不是从使用精心设计的库开始。
于 2009-02-26T10:16:57.450 回答
24

好吧,除非您打算等待 Java 8,希望他们能够实现更好的 API来操作日期和时间,否则请使用Joda-Time。它可以节省时间并避免许多麻烦。

于 2009-02-26T09:54:57.580 回答
15

答案是:这取决于

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

就我个人而言,就我所需要的复杂性而言,我发现 JODA 走得太远了。标准 javaDateCalendar类中的 2 个主要(恕我直言)错误是:

  1. 它们是可变的
  2. 他们将即时年月日的概念混为一谈

YearMonthDay尽管 JODA 解决了这些问题,但您会发现为和滚动您自己的类非常容易Instant,它们都使用底层的 java 类进行实际的“日历”计算。然后,您不必熟悉超过 100 个类的 API、不同的格式/解析机制等。

当然,如果您确实需要不同年表的完整表示(例如希伯来语)或希望能够定义自己的虚构日历系统(例如,对于您正在编写的游戏),那么也许 JODA 或 JRS-310 适合您。如果没有,那么我建议您自己滚动可能是要走的路。

JSR-310 规范负责人是第一位编写 JODA 的 Stephen Colebourne,因此在逻辑上将取代JODA。

于 2009-02-26T10:03:47.623 回答
7

这完全取决于您对日期的处理。如果您只是简单地保留它们,Java 内置的 Dates 可能会满足您的所有需求。但是,如果您正在进行大量的时间日期操作,那么使用 Joda 可能会更好。

于 2009-02-26T11:31:05.073 回答
7

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

  1. Joda-Time 支持ISO 8601 标准,这是一种标准的
    日期表示方式。
  2. 在 Joda-Time 中添加和减去日/月/年比 java.util.date 更容易。
  3. 在 Joda-Time 中,按给定日期进行初始化要容易得多。
  4. Joda-Time 也支持时区。
  5. Joda-Time 有更好的内置解析。像“2014-02-31”这样的错误日期会作为错误抛出:Exception in thread "main" org.joda.time.IllegalFieldValueException: Cannot parse "2014-02-31": Value 31 for dayOfMonth must be in the range [1,28].

您可能会喜欢此页面以获取更多详细信息: http ://swcodes.blogspot.com/

于 2014-06-10T11:13:51.510 回答