尽管Joda具有丰富的功能,并且比标准Java时间更为复杂,但它不一定总是最好的使用方式。如何确定在任何Java代码中应使用Joda Time还是Java Time?
是否有某种准则可以告诉我们如何根据我们的要求选择合适的准则?
尽管Joda具有丰富的功能,并且比标准Java时间更为复杂,但它不一定总是最好的使用方式。如何确定在任何Java代码中应使用Joda Time还是Java Time?
是否有某种准则可以告诉我们如何根据我们的要求选择合适的准则?
Answers:
Joda Time是对Java时间库的改进,除了以下例外,几乎总是正确的选择:
当很难或不希望将第三方依赖项添加到您的项目中时
在公共接口中使用它会引起问题,例如让ORM处理Java和Joda时间字段
但是,对于2),如果可能的话,最好在内部使用Joda。
上面的事情值得牢记,但应该很少见。如有疑问,请与乔达一起去。
请注意,在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可以使我们感到舒适和安全。
一些其他参考:
Java标准日期API从根本上被破坏了,以至于我经常考虑将JVM的库扩展添加Joda Time,以便默认情况下将其与Java API的其余部分一起加载到类路径中。
如果您曾经有过将国际化和时区改型到旧版Java应用程序中的任务,并且试图单独使用标准Java API,那么您将理解我的意思。我能够将数千行asinine代码变成少于一百行。生产率的提高是不可想象的。
此外,标准的Date API并不直观,可以在几小时而不是几周内获取流畅的Joda API。您试图到达两英里外的小岛的类比更类似于以下内容。
1)乘坐摩托艇仅需6分钟即可到达岛上。
要么...
2)在一个疯子操纵的飓风中,一根临时搭建的竹筏与葡萄树绑在一起,疯子的最好朋友是排球。
正如其他答案所指出的那样,由于Hibernate现在具有允许将Joda类型的Bean属性映射到数据库日期/时间字段的插件,所以甚至还不存在诸如ORM之类的一些弊端。JPA也可能对此有一个答案。
如果您希望您的应用程序作为桌面应用程序具有最小化的占用空间,因为它涉及磁盘空间,那么Java甚至不是正确的语言选择。
还有一点:
Java-Time(即Date
)不是ThreadSafe,而JodaTime是。
因此,在诸如
否则,对于简单的应用程序,Java-Time可以。
java.time
是通过不变性实现的。参见stackoverflow.com/questions/9303532/…。这对于简单和复杂的应用程序都适用。甚至api doc都声明“所有类都是不可变的并且是线程安全的”(从第二段引用)。java.util
另一方面,旧类有几个问题。我意识到这个答案是针对后者的,但是对于现在区分是很重要的。
更新:最早的Java版本附带的旧的日期时间类现在已成为旧版,被 Java 8,Java 9和更高版本中内置的java.time类正式取代。
Date
,Calendar
,SimpleDateFormat
,和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添加内容的试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。