乔达时间vs Java时间


19

尽管Joda具有丰富的功能,并且比标准Java时间更为复杂,但它不一定总是最好的使用方式。如何确定在任何Java代码中应使用Joda Time还是Java Time?

是否有某种准则可以告诉我们如何根据我们的要求选择合适的准则?


5
通过使用Java 8中包含的新的Date&Time API来兼顾两者。这在Joda Time的影响很大。实际上,主要作者是《乔达时报》的作者斯蒂芬·科尔本。
Joachim Sauer

1
@JoachimSauer它是否已出现在最终版本中,或者这将在Java 8启动时发生?
m3th0dman

@ m3th0dman:它将包含在最终的Java 8版本中,尚未发布。GA 计划于2013-09-09举行
Joachim Sauer

现在,Joda-Time和原始Java日期-时间类都已被Java 8,Java 9和更高版本中内置的java.time类淘汰。
罗勒·布尔克

Answers:


29

Joda Time是对Java时间库的改进,除了以下例外,几乎总是正确的选择:

  1. 当很难或不希望将第三方依赖项添加到您的项目中时

  2. 在公共接口中使用它会引起问题,例如让ORM处理Java和Joda时间字段

但是,对于2),如果可能的话,最好在内部使用Joda。

上面的事情值得牢记,但应该很少见。如有疑问,请与乔达一起去。


请告诉我“内部使用Joda”的含义。我是一个初学者,我不知道所有这些事情。
绝地武士

5
@Jedi Knight:这意味着应用程序将Joda用作自己的逻辑,并且仅在与需要它的外部系统通信时才与java.util.Date进行转换。
Michael Borgwardt

2
通过“内部”,它可以在整个应用程序内部(如Michael的示例),但可以在类的内部或只是特定方法。假设您有一个实用程序方法,该方法接受两个Java Date对象并计算它们之间的工作日数,但是它包含一个错误。要解决此问题,改用JodaTime重写该方法可能会更加容易,但是您可能无法花时间重构所有调用该方法的代码,因此您无需更改方法签名。在这种情况下,您在该方法中“内部”使用Joda。
罗伯·约翰逊

仅供参考,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。请参见Oracle教程
罗勒·布尔克

13

请注意,在Joda-Time网站上指出:

Java SE 8之前的标准日期和时间类很差。通过直接解决此问题,Joda-Time已成为Java的事实上的标准日期和时间库。请注意,从Java SE 8开始,要求用户迁移到java.time(JSR-310)。

主要贡献者乔达时间jodastephen,也是JSR-310的主要贡献者,这些可以在可见的GitHub库关联http://www.threeten.org/。顺便说一句,jodastephen也有一个SO句柄...

我认为可以肯定地说,使用Java 8及更高版本提供的新的Date and Time API可以使我们感到舒适和安全。

一些其他参考:


12

Java标准日期API从根本上被破坏了,以至于我经常考虑将JVM的库扩展添加Joda Time,以便默认情况下将其与Java API的其余部分一起加载到类路径中。

如果您曾经有过将国际化和时区改型到旧版Java应用程序中的任务,并且试图单独使用标准Java API,那么您将理解我的意思。我能够将数千行asinine代码变成少于一百行。生产率的提高是不可想象的。

此外,标准的Date API并不直观,可以在几小时而不是几周内获取流畅的Joda API。您试图到达两英里外的小岛的类比更类似于以下内容。

1)乘坐摩托艇仅需6分钟即可到达岛上。

要么...

2)在一个疯子操纵的飓风中,一根临时搭建的竹筏与葡萄树绑在一起,疯子的最好朋友是排球。

正如其他答案所指出的那样,由于Hibernate现在具有允许将Joda类型的Bean属性映射到数据库日期/时间字段的插件,所以甚至还不存在诸如ORM之类的一些弊端。JPA也可能对此有一个答案。

如果您希望您的应用程序作为桌面应用程序具有最小化的占用空间,因为它涉及磁盘空间,那么Java甚至不是正确的语言选择。


仅供参考,Joda-Time项目现在处于维护模式,团队建议迁移到java.time类。请参见Oracle教程
罗勒·布尔克

8

还有一点: Java-Time(即Date)不是ThreadSafe,而JodaTime是。 因此,在诸如

  • 多线程环境访问公共资源
  • 像情况一样的集中时间同步

否则,对于简单的应用程序,Java-Time可以。


甚至DateTime也不是ThreadSafe,不是吗?如果我做错了,请纠正我。
vintesh 2013年

3
包括DateTime类在内的绝大多数Joda库都是不可变的,因此是线程安全的。但是,有一些可变类不是线程安全的。请参阅joda-time.sourceforge.net/faq.html#threading
罗伯特·约翰逊

1
线程安全性java.time是通过不变性实现的。参见stackoverflow.com/questions/9303532/…。这对于简单和复杂的应用程序都适用。甚至api doc都声明“所有类都是不可变的并且是线程安全的”(从第二段引用)。java.util另一方面,旧类有几个问题。我意识到这个答案是针对后者的,但是对于现在区分是很重要的。
悠悠球

不将日期时间表示为不可变的值只是疯狂。我知道现在已经解决了,但实际上他们在想什么呢?
Aluan Haddad

2

java.time框架取代了两个传统的日期,时间类和乔达时间

更新:最早的Java版本附带的旧的日期时间类现在已成为旧版, Java 8,Java 9和更高版本中内置的java.time类正式取代

DateCalendarSimpleDateFormat,和java.sql.*都应该避免日期时间类。永远不需要使用这些令人困惑,麻烦,设计欠佳的类。它们完全被java.time类取代。现在,它们的唯一目的是维护现有的旧代码。与旧代码交互时,可以通过调用添加到旧类中的新方法来与java.time进行转换。有关转换的更多信息,请参见:将java.util.Date转换为“ java.time”类型?

现在处于维护模式Joda-Time项目建议迁移到java.time类。Joda-Time项目启发了java.time框架。两者均由同一个人斯蒂芬·科尔本(Stephen Colebourne)领导。您可以将java.time视为Joda-Time的重写/重新设计,所有新代码都使用了从构建业界第一个全面而复杂的日期时间库中学到的东西。

要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。

大部分的java.time功能后移植到Java 6和7 ThreeTen,反向移植,并进一步用于安卓ThreeTenABP(见如何使用......)。

ThreeTen-额外项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多

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.