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

147

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

相比第三方库(如Joda时间),使用Java日期和时间类有哪些优缺点?我想这些第三方库存在有其好的原因,但我从未真正比较过它们。


5
澄清一些评论...虽然Joda-Time仍在使用,但是它的继承者JSR 310:日期和时间API确实计划成为Java 8的一部分,并包含在java.time包中。Oracle已经有了一个draft教程。JDBC 4.2 将处理新的数据类型。 - Basil Bourque
5个回答

197

EDIT: 现在 Java 8 已经发布了,如果你能使用它,请使用!我认为 java.time 比 Joda Time 更加简洁。然而,如果你还在使用 Java 8 之前的版本,继续阅读...

Max询问使用Joda的利弊:

优点:

  • 它很好用。我强烈怀疑在Joda中出现的错误比标准Java库要少得多。由于设计问题,Java库中的一些错误非常难以(甚至不可能)修复。
  • 它旨在鼓励您以正确的方式考虑日期/时间处理 - 将“本地时间”(例如“无论我在哪里,都在早上7点钟叫醒我”)和一个瞬间(“我在太平洋时间下午3点钟打电话给詹姆斯;他可能在其他时区,但这是相同的瞬间”)的概念分离开来。
  • 我认为它使更新时区数据库变得更容易,因为时区数据库相对频繁地发生变化。
  • 它有一个良好的不可变性,这样做可以让生活变得更轻松。
  • 在不可变性的基础上,所有格式化程序都是线程安全的,这非常好,因为您几乎总是希望通过应用程序重复使用单个格式化程序。
  • 你将有一个尝试学习Java 8中java.time的一个良好开端,因为它们至少有些相似。

缺点:

  • 这是另一个要学习的API(尽管文档写得很好)。
  • 这是另一个要构建和部署的库。
  • 当你使用Java 8时,仍然需要一些迁移工作。
  • 在过去我曾无法有效地使用DateTimeZoneBuilder。但这是一个非常罕见的情况。

针对 oxbow_lakes 构建自己的小型 API 的想法,以下是我认为这样做的不良影响:

  • 这项工作已经完成,为什么还要重复劳动呢?
  • 新加入团队的人更可能熟悉Joda而不是您自己的API。
  • 除了最简单的用法外,很可能会出错...即使您一开始认为只需要简单功能,但这些东西往往会逐渐变得更加复杂。日期和时间的操作很难正确执行。此外,内置的Java API也难以正确使用——只需查看日历API的日期/时间算术规则即可知道。在这些API上构建任何东西都比使用设计良好的库来开始一个坏主意。

5
@adi: 更新了 - 这仍然是有效的,但希望 JSR-310将成为Java 8的一部分,但它不是Java 7的一部分。 (我的翻译意思是:这段话表示虽然JSR-310在Java 7中并不是一部分,但它仍然有效。希望JSR-310能够作为Java 8的一部分出现。) - Jon Skeet
2
@JonSkeet 自Java-8引入以来,这个应该被更新了。 - Sionnach733
@Sionnach733:我不会更新全部内容,但我会在开头添加一些东西。 - Jon Skeet
2
Java 6和7有一个java.time.*的后移版本:http://www.threeten.org/threetenbp/ - Miscreant

24

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


优缺点?我从未使用过Joda时间 - 很有趣听听人们喜欢它的原因。 - Max Stewart

15
答案是:这取决于具体情况

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

个人认为,对于我所需的内容而言,JODA在复杂性方面步伐太大了。标准Java DateCalendar类中的两个主要(在我看来)错误是:

  1. 它们是可变的
  2. 将年月日的概念与瞬时时间混淆

虽然JODA解决了这些问题,但您会发现很容易为YearMonthDayInstant编写自己的类,这两个类都在底层使用Java类进行实际“日历”计算。然后,您就不必熟悉超过100个类的API、不同的格式化/解析机制等。

当然,如果您确实需要完整表示不同的年表(例如希伯来语)或希望能够定义自己的想象日历系统(例如为您编写的游戏),那么也许JODA或JRS-310适合您。否则,我建议编写自己的代码可能是更好的选择。

JSR-310规范的负责人是Stephen Colebourne,他首先编写了JODA,因此将在逻辑上替换JODA。


16
在我看来,这个东西不应该由非专业人士重新发明。 - Jon Skeet
6
我并不是个白痴,但我在使用Java D&T APIs时仍然遇到了问题。它们非常容易被误用。人们更容易正确地使用Joda的原因是Joda设计得更好——它会“鼓励”你做正确的事情。 - Jon Skeet
6
在处理日期/时间API方面,我每周都会选择信任专家而非自己。这不像是一些没有其他人使用的随机第三方API。"> 100类"的论点是个假象,因为显然你并不需要学习它们全部。 - Jon Skeet
5
我想我们必须同意各自保留意见。对我来说,任何由专家编写、设计良好且可信的日期/时间,避免了我进行繁琐的时间计算,都是“必备”的。在过去的一年里,我非常憎恨人类时间测量。 - Jon Skeet
5
如果Joda已经存在,那么自己编写类库是一个极其糟糕的想法。不要这样做。Joda确实有很多你不会使用的类,但答案很简单——不需要使用你不需要的类。编写自己的类库可能会出现很多问题,无论是开发还是测试,所需的工作量都非常大。或者,你可以添加一个类库,而Joda还有一个额外的好处是,新加入你团队的成员可能已经使用过它,但他们不会使用你自己编写的类库。 - Dawood ibn Kareem
显示剩余14条评论

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/


7

这完全取决于你对日期的处理。如果你只是将它们持久化,那么Java内置的Dates可能已经能够满足你的所有需求了。但是,如果你需要进行大量的时间日期操作,使用Joda会更好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接