我应该使用Javadate和时间类,还是像Joda Time一样使用第三方库?

我正在创build一个基于networking的系统,将在世界各国使用。 一种必须存储的数据是date和时间。

与Joda时间等第三方库相比,使用Javadate和时间类的优点和缺点是什么? 我想这些第三方库的存在是有原因的,但我从来没有真正比较过他们自己。

编辑:现在,Java 8已经发布,如果你可以使用,那么! 在我看来, java.time比Joda Time更干净。 但是,如果您在Java-8之前卡住了,请继续阅读…

马克斯要求使用乔达的优点和缺点…

优点:

  • 它工作,很好。 我强烈怀疑Joda中的错误远远less于标准的Java库。 由于devise原因,Java库中的一些错误确实很难修复(如果不是不可能的话)。
  • 它旨在鼓励您以正确的方式考虑date/时间处理 – 将“当地时间”的概念(例如“无论何时上午7点唤醒我”)和即时(“我打电话给詹姆斯太平洋标准时间下午3点,可能不是下午3点,但是现在是同一时间“)
  • 我相信这样可以更容易地更新时区数据库,而时区数据库的变化比较频繁
  • 它有一个很好的不变性的故事,这使得生活更容易IME。
  • 从不变性开始,所有格式化程序都是线程安全的,这非常棒,因为您几乎总是希望通过应用程序重用单个格式化程序
  • 在Java 8中学习java.time会有所java.time ,因为它们至less有些类似

缺点:

  • 这是另一个API学习(虽然文档是相当不错的)
  • 这是另一个build立和部署的图书馆
  • 当你使用Java 8时,仍然有一些工作要迁移你的技能
  • 我以前没有有效地使用DateTimeZoneBuilder 。 尽pipe这是一个非常罕见的用例。

为了回应oxbow_lakes有效构build你自己的小API的想法,下面是我对这是一个坏主意的看法:

  • 是工作。 为什么你已经完成了工作?
  • 与你自己开发的API相比,你的团队的新手更可能熟悉Joda
  • 除了最简单的用途之外,你很可能会弄错任何东西……即使你最初认为你只需要简单的function,这些东西也有一个越来越复杂的习惯。 date和时间操作很难做到正确。 此外,内置的Java API很难正确使用 – 只需查看日历API的date/时间algorithm工作原理即可。 在这些基础上build立任何东西是一个坏主意,而不是使用精心devise的库来开始。

那么,除非你打算等待Java 8,希望他们能够实现一个更好的API来处理date和时间,是的,请使用Joda-Time 。 节省时间,避免许多麻烦。

答案是: 这取决于

JODA(和JSR-310)是一个全function的date/时间库,包括支持多个日历系统的使用。

就我个人而言,我发现JODA对于我所需要的复杂性来说太过分了。 标准java DateCalendar类中的两个主要(恕我直言)错误是:

  1. 他们是可变的
  2. 他们将瞬间即时的“年 – 月日”概念混为一谈

虽然JODA解决了这些问题,但是您可以很容易地为YearMonthDayInstant YearMonthDay自己的类,它们都使用实际的“日历”计算下的java类。 那么你不必熟悉一个> 100个类的API,一个不同的格式化/parsing机制等。

当然,如果你确实需要不同的年代表(比如希伯来文)的完整expression,或者希望能够定义你自己想象中的日历系统(例如你正在写一个游戏),那么JODA或者JRS-310也许是你的。 如果不是的话,那么我build议把自己推出是可能的。

JSR-310规范的领导者是第一名写JODA的Stephen Colebourne,所以在逻辑上取代了 JODA。

这一切都取决于你在做什么date。 如果你只是坚持他们,他们的Java内置的date可能会做你想要的一切。 但是,如果你正在做大量的时间date操作,你可能会更好地与乔达。

你应该使用乔达时间库,因为:

  1. Joda-Time支持ISO 8601标准 ,这是一种标准的方式
    date表示。
  2. Joda-Time比java.util.date增加和减less一天/一年/一年更容易。
  3. 在Joda-Time中,给定date的初始化要容易得多。
  4. Joda-Time也支持时区。
  5. Joda-Time有一个更好的内置parsing。 像“2014-02-31”这样的错误date被引发为错误: 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/