我应该使用Java日期和时间类,还是使用像Joda Time这样的第三方库?

时间:2009-02-26 09:51:54

标签: java date time jodatime

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

与第三方库(如Joda time)相比,使用Java日期和时间类的优缺点是什么?我猜这些第三方图书馆存在的原因很充分,但我自己从未真正比较过它们。

5 个答案:

答案 0 :(得分:196)

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

Max询问使用Joda的优缺点......

优点:

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

缺点:

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

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

  • 这是工作。为什么工作已经为你完成了?
  • 您的团队的新手更有可能熟悉Joda而不是您自己开发的API
  • 除了最简单的用途之外,你可能会犯错误...即使你最初认为你只需要简单的功能,这些东西也会变得越来越复杂,一点一点。日期和时间操作 hard 正确执行。此外,内置的Java API很难正确使用 - 只需查看日历API的日期/时间算法的工作原理。在这些之上构建任何东西都是一个坏主意,而不是使用精心设计的库来开始。

答案 1 :(得分:24)

好吧,除非你打算等待Java 8,希望他们实现a better API来操纵日期和时间,是的,请使用Joda-Time。节省时间,避免许多麻烦。

答案 2 :(得分:15)

答案是:取决于

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

我个人认为JODA在我需要的复杂性方面迈出了一大步。标准java DateCalendar类中的2个主要(IMHO)错误是:

  1. 他们是可变的
  2. 他们将“即时”的年 - 月 - 日概念混为一谈
  3. 虽然这些都是由JODA解决的,但你会发现很容易为YearMonthDayInstant推送自己的类,它们都使用底层的java类进行实际的“日历”计算。然后,您不必熟悉> 100个类的API,不同的格式化/解析机制等。

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

    JSR-310规范的主角是Stephen Colebourne,他在第一名写了JODA,所以逻辑上替换 JODA。

答案 3 :(得分:7)

这完全取决于你对日期做了什么。如果您只是坚持它们,那么Java内置的日期可能会完成您想要的所有操作。但是如果你正在进行广泛的时间操作,那么你可能会更好地使用Joda。

答案 4 :(得分:7)

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

  1. Joda-Time支持ISO 8601 standard,这是一种标准的方式 日期表示。
  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].
  6. 您可能会喜欢此页面了解更多详情: http://swcodes.blogspot.com/