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

我应该使用Java日期和时间类还是使用像Joda time这样的第三方库?,java,date,time,jodatime,Java,Date,Time,Jodatime,我正在创建一个基于网络的系统,将在世界各地的国家使用。必须存储的一种数据类型是日期和时间 与第三方库(如)相比,使用Java日期和时间类的优缺点是什么?我想这些第三方库的存在有一个很好的理由,但我自己从来没有真正比较过它们。好吧,除非您打算等待Java 8,希望它们能够实现操纵日期和时间,是的,请使用。这既节省了时间,又避免了许多麻烦。答案是:视情况而定 JODA和JSR-310是一个功能齐全的日期/时间库,包括支持与多个日历系统一起使用 就我个人而言,我发现JODA在复杂性方面比我所需要的要远

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


与第三方库(如)相比,使用Java日期和时间类的优缺点是什么?我想这些第三方库的存在有一个很好的理由,但我自己从来没有真正比较过它们。

好吧,除非您打算等待Java 8,希望它们能够实现操纵日期和时间,是的,请使用。这既节省了时间,又避免了许多麻烦。

答案是:视情况而定

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

就我个人而言,我发现JODA在复杂性方面比我所需要的要远了一步。标准java Date和Calendar类中的两个主要IMHO错误是:

它们是可变的 他们把一年一个月一天的概念从一个瞬间混淆了 尽管JODA解决了这些问题,但您会发现为YearMonthDay和Instant推出自己的类非常容易,这两个类都使用java类进行实际的日历计算。然后,您不必熟悉>100个类的API、不同的格式化/解析机制等

当然,如果您确实需要不同年表的完整表示,例如希伯来文,或者希望能够定义您自己想象的日历系统,例如您正在编写的游戏,那么JODA或JRS-310可能适合您。如果不是的话,那么我建议你自己滚动可能是一种方式


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

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

Max询问使用Joda的利弊

优点:

它工作得很好。我强烈怀疑Joda中的bug远远少于标准Java库。由于设计原因,Java库中的一些bug即使不是不可能修复,也是非常困难的。 它旨在鼓励您以正确的方式考虑日期/时间处理-分离本地时间的概念,例如在早上7点叫醒我,无论我在哪里,以及在太平洋标准时间下午3点给詹姆斯打电话的瞬间;他现在的位置可能不是下午3点,但也是同一时刻 我相信它使更新时区数据库变得更容易,因为时区数据库的变化相对频繁 它有一个很好的不变性的故事,这使生活更容易。 从不变性开始,所有的格式化程序都是线程安全的,这很好,因为您几乎总是希望在应用程序中重用单个格式化程序 在学习Java8中的java.time时,您将领先一步,因为它们至少有些相似 缺点:

这是另一个需要学习的API,尽管文档非常好 它是另一个可以构建和部署的库 当您使用Java8时,仍有一些工作需要迁移您的技能 我过去没有有效地使用DateTimeZoneBuilder。这是一个非常罕见的用例。 为了回应oxbow_lakes关于有效构建自己的小型API的想法,以下是我对这是一个坏主意的看法:

这是工作。既然已经为你做了,为什么还要工作? 您团队的新成员更可能熟悉Joda,而不是您自己开发的API 除了最简单的用途之外,你很可能会把它弄错。。。即使你最初认为你只需要简单的功能,这些东西也会变得越来越复杂,一次只需要一点点。日期和时间操作很难正确执行。此外,内置Java API很难正确使用——只要看看日历API的日期/时间算法是如何工作的规则就知道了。在这些基础上构建任何东西都是一个坏主意,而不是从使用设计良好的库开始。
这完全取决于你对约会做了什么。如果您只是将它们持久化,那么Java的内置日期可能会满足您的所有需求。但是,如果您正在进行大量的时间-日期操作,那么您最好使用Joda。

您应该使用Joda时间库,因为:

Joda Time支持,这是一种标准的 日期表示法。 在Joda Time中,添加和减去一天/月/年比java.util.date更容易。 在Joda时间内,通过给定日期进行初始化要容易得多。 Joda Time也支持时区。 Joda Time具有更好的内置解析功能。错误的日期(如2014-02-31)作为错误抛出:主线程中出现异常 org.joda.time.IllegalFieldValueException:无法解析2014-02-31: dayOfMonth的值31必须在[1,28]范围内。 您可能喜欢此页面了解更多详细信息:

利弊?我从来没有用过乔达的时间——如果能听到人们喜欢什么,那会很有趣
我也不是白痴,但我在Java D&T API方面仍然有问题。它们很容易被滥用。人们更有可能正确使用Joda的原因是Joda设计得更好——它鼓励你做正确的事情。我相信一周中的任何一天,当谈到最新/时间API时,专家都会胜过我自己。这不像是一个没有其他人使用的随机第三方API。“100门课程”的争论是个讨厌鬼,因为你显然不需要把它们都学一遍。我想我们必须同意不同意见。从我的观点来看,任何由专家编写的、设计良好的、值得信赖的日期/时间,都是我必须拥有的,它可以避免我用时间算术来做脏活。在过去的一年里,我学会了带着一种激情憎恨人类的时间测量。当乔达存在的时候,滚动你自己的时间是一个非常糟糕的想法。不要这样做。的确,Joda有几十个你不打算使用的类,但答案很简单——不要使用你不需要的类。编写您自己的这种类型的库可能会出现很多问题—无论是在开发还是在测试中,您都需要付出巨大的努力。或者,您可以只添加一个库。然后,Joda还有一个额外的好处,您团队的新成员可能以前使用过它,但他们不会使用您自己开发的库。@adi:Updated-它仍然有效,但希望JSR-310将成为Java 8的一部分,但它不是Java7的一部分。@JonSkeet这可能应该在Java引入后更新-8@Sionnach733:我不打算全部更新,但我会在开始时添加一些内容。有一个java.time的后端口。*对于java 6和7:为了澄清一些评论…而Joda time继续,它的后继者确实计划在包下成为Java8的一部分。甲骨文有一份草稿。JDBC4.2支持新的数据类型。