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


147

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

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


5
为了澄清一些意见……在Joda-Time继续进行的同时,其继任者JSR 310:Date and Time API实际上已计划成为java.time包下Java 8的一部分。Oracle有一个教程草案。JDBC 4.2 将处理新的数据类型。
罗勒·布尔克

Answers:


197

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

Max询问使用Joda的利弊...

优点:

  • 效果很好。我强烈怀疑Joda中的错误比标准Java库少得多。由于设计的原因,Java库中的某些错误确实很难修复(如果不是不可能的话)。
  • 它旨在鼓励您以正确的方式考虑日期/时间的处理-将“本地时间”(例如“无论我在哪里早上7点叫醒我”)的概念和时间间隔(“我叫詹姆斯”太平洋标准时间(PST)下午3点;可能不是他现在所在的下午3点,但这是同一时刻”)
  • 我相信这样可以更轻松地更新时区数据库,该数据库的确会相对频繁地更改
  • 它具有良好的不变性的故事,这让生活很多容易IME。
  • 从不变性出发,所有格式化程序都是线程安全的,这非常好,因为您几乎总是想在应用程序中重用单个格式化程序
  • 您将抢先学习java.timeJava 8,因为它们至少有些相似

缺点:

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

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

  • 是工作。为什么已经为您完成工作?
  • 与自己的API相比,团队的新手更可能熟悉Joda
  • 除了最简单的用途之外,您可能还会犯错……即使您最初认为只需要简单的功能,这些习惯也会使一次变得越来越复杂,甚至一点点。日期和时间操作很难正确执行。此外,内置的Java API很难正确使用 -只需查看日历API的日期/时间算术如何工作的规则即可。在这些之上构建任何东西都是一个坏主意,而不是使用一个设计良好的库开始。

5
@adi:更新-它仍然有效,但希望 JSR-310将成为Java 8的一部分,但它不是Java 7中的一部分
乔恩斯基特

2
@JonSkeet自Java-8引入以来,应该对此进行更新
Sionnach733 2014年

@ Sionnach733:我不会更新所有内容,但是一开始我会添加一些内容。
乔恩·斯基特

2
java.time.*Java 6和7的反向
错误的


15

答案是:这取决于

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

就我个人而言,我发现JODA相对于我所需要的复杂性而言是一个太大的进步。标准java DateCalendar类中的2个主要(IMHO)错误是:

  1. 他们是可变的
  2. 他们从即时中混合了年月日的概念

尽管JODA解决了这些问题,但您会发现轻松地为YearMonthDay和滚动自己的类Instant,它们都使用Java类进行实际的“日历”计算。然后,您不必熟悉> 100个类的API,不同的格式/解析机制等。

当然,如果您确实需要完整地表示不同的时间顺序(例如希伯来语),或者希望能够定义自己的假想日历系统(例如您正在编写的游戏),那么JODA或JRS-310可能适合您。如果没有,那么我建议自己动手做是可行的方法。

JSR-310规范的负责人是斯蒂芬·科尔本(Stephen Colebourne),他是第一位撰写JODA的人,因此在逻辑上将取代 JODA。


16
应该不是由非专业人员进行彻底改造,IMO。
乔恩·斯基特

6
我也不是一个笨蛋,但是Java D&T API仍然有问题。它们很容易被滥用。人们更有可能正确使用Joda的原因是,Joda设计得更好-它鼓励您做正确的事。
乔恩·斯基特

6
在日期/时间API方面,我会在一周的任何一天信任我自己的专家。并不是说这是一些随机的第三方API,没有其他人在使用它。“> 100个班级”的论点是个草率的人,因为您显然不需要全部学习它们。
乔恩·斯基特

5
我想我们必须同意有所不同。从我的角度来看,任何由专家撰写经过精心设计的可信赖日期/时间都可以避免我花大量时间进行繁琐的工作,这些都被认为是“必须具备”的条件。在过去的一年中,我学会了热情地讨厌人类的时间测量。
乔恩·斯基特

5
当乔达(Joda)存在时,自己动手做一个简单的想法。只是不要这样做。确实,Joda拥有数十种您不会使用的类,但是答案很简单-不要使用不需要的类。编写自己的这种类型的库可能会出错,在开发和测试中您将付出巨大的努力。或者,您可以只添加一个库。然后,乔达(Joda)具有一个额外的好处,那就是您团队中的新兵可能以前使用过它,但是他们不会使用您自己的图书馆。
达伍德·伊本·卡里姆

7

这完全取决于您对日期的处理方式。如果只是简单地保留它们,则Java内置的Dates可能会完成您希望它们执行的所有操作。但是,如果您要进行大量的日期操作,那么使用Joda可能会更好。


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/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.