我应该使用 Java 日期和时间类还是使用像 Joda Time 这样的 3rd 方库?
Posted
技术标签:
【中文标题】我应该使用 Java 日期和时间类还是使用像 Joda Time 这样的 3rd 方库?【英文标题】:Should I use Java date and time classes or go with a 3rd party library like Joda Time? 【发布时间】:2010-10-10 01:05:45 【问题描述】:我正在创建一个基于网络的系统,它将在世界各地的国家/地区使用。必须存储的一种数据类型是日期和时间。
与Joda time 等第三方库相比,使用Java 日期和时间类的优缺点是什么?我想这些第三方库的存在是有充分理由的,但我自己从未真正比较过它们。
【问题讨论】:
澄清一些 cmets... 虽然 Joda-Time 仍在继续,但它的继任者 JSR 310: Date and Time API 确实计划在 java.time 包下成为 Java 8 的一部分。 Oracle 有一个tutorial 的草稿。 JDBC 4.2 will handle 新的数据类型。 【参考方案1】:编辑:现在 Java 8 已经发布,如果你可以使用它,那就这样做吧!在我看来,java.time
甚至比 Joda Time 更干净。但是,如果您在 Java-8 之前遇到问题,请继续阅读...
Max 询问使用 Joda 的利弊...
优点:
效果很好,非常好。我强烈怀疑 Joda 中的错误比标准 Java 库要少得多。由于设计原因,Java 库中的一些错误确实很难(如果不是不可能的话)修复。 它旨在鼓励您以正确的方式思考日期/时间处理 - 将“本地时间”(例如,“无论我在哪里,早上 7 点叫醒我”)和即时时间(“我”我在太平洋标准时间下午 3 点给詹姆斯打电话;他所在的位置可能不是下午 3 点,但那是同一时刻”) 我相信更新时区数据库会更容易,确实更改相对频繁 它有一个很好的不变性故事,这使得 IME 生活变得很多更容易。 从不变性开始,所有格式化程序都是线程安全的,这非常棒,因为您几乎总是希望通过应用程序重用单个格式化程序 您将在学习 Java 8 中的java.time
方面占得先机,因为它们至少有些相似
缺点:
这是另一个需要学习的 API(尽管文档非常好) 这是另一个构建和部署的库 当您使用 Java 8 时,仍有一些工作可以迁移您的技能 我过去未能有效地使用DateTimeZoneBuilder
。这是一个非常罕见的用例。
为了响应 oxbow_lakes 有效构建自己的小型 API 的想法,以下是我对为什么这是一个坏主意的看法:
这是工作。为什么已经为您完成了工作? 您团队的新人更可能熟悉 Joda,而不是您自己开发的 API 除了最简单的用途之外,您很可能会弄错......即使您最初认为您只需要简单的功能,这些东西都会变得越来越复杂,一个一点点。日期和时间操作很难正确完成。此外,内置的 Java API 很难正确使用 - 只需查看日历 API 的日期/时间算法如何工作的规则即可。在这些之上构建任何东西都是一个坏主意,而不是从使用精心设计的库开始。【讨论】:
@adi:已更新 - 它仍然有效,但希望 JSR-310 将成为 Java 8 的一部分,但它不是 Java 7 的一部分。 @JonSkeet 这可能应该在引入 java-8 后更新 @Sionnach733:我不会全部更新,但我会在开头添加一些内容。 Java 6 和 7 有一个java.time.*
的反向移植:threeten.org/threetenbp【参考方案2】:
好吧,除非你打算等待 Java 8,希望他们实现 a better API 来操作日期和时间,是的,请使用 Joda-Time。既省时又省心。
【讨论】:
利弊?我从未使用过 Joda 时间 - 听听人们喜欢它会很有趣。【参考方案3】:答案是:视情况而定
JODA(和 JSR-310)是一个功能齐全的日期/时间库,包括支持与多个日历系统一起使用。
就我个人而言,我发现 JODA 对于我需要的复杂性来说太过分了。标准 java Date
和 Calendar
类中的 2 个主要(恕我直言)错误是:
-
它们是可变的
他们将“年-月-日”的概念与“即时”混为一谈
虽然 JODA 解决了这些问题,但您会发现为 YearMonthDay
和 Instant
推出自己的类非常容易,它们都使用底层的 java 类进行实际的“日历”计算。这样您就不必熟悉超过 100 个类的 API、不同的格式化/解析机制等。
当然,如果您确实需要不同年表的完整表示(例如希伯来语)或希望能够定义自己的虚构日历系统(例如,对于您正在编写的游戏),那么也许 JODA 或 JRS-310 适合您.如果没有,那么我建议您自己滚动可能是要走的路。
JSR-310 规范负责人是 Stephen Colebourne,他在第一名编写了 JODA,因此将在逻辑上替换 JODA。
【讨论】:
应该不由非专业人士重新发明,IMO。 我也不是白痴,但我仍然遇到 Java D&T API 的问题。它们很容易被滥用。人们更有可能正确使用 Joda 的原因是 Joda 设计得更好 - 它鼓励你做正确的事。 当涉及到日期/时间 API 时,我相信一位专家胜过自己。这不像是一些没有其他人使用它的随机 3rd 方 API。 “>100 个类”的说法是个稻草人,因为您显然不需要全部学习。 我想我们必须同意不同。任何由专家编写的值得信赖的日期/时间和精心设计,避免我不得不用时间算术做肮脏的工作,从我的角度来看,算作“必须拥有”。在过去的一年里,我学会了怀着热情讨厌人类的时间测量。 在 Joda 存在的情况下自行开发是一个非常糟糕的主意。只是不要这样做。确实,Joda 有几十个你不会使用的类,但答案很简单——不要使用你不需要的类。编写自己的这种类型的库可能会出错的地方太多了——无论是在开发中还是在测试中,你必须付出的努力是巨大的。或者,您可以只添加一个库。然后,Joda 的额外好处是,您团队的新员工可能以前使用过它,但他们不会使用您自己开发的库。【参考方案4】:这完全取决于您对日期的处理。如果您只是简单地保留它们,Java 内置的 Dates 可能会满足您的所有需求。但是,如果您要进行大量的时间日期操作,那么使用 Joda 可能会更好。
【讨论】:
【参考方案5】:您应该使用 Joda-Time 库,因为:
-
Joda-Time 支持ISO 8601 standard,这是标准的
日期表示。
在 Joda-Time 中添加和减去日/月/年比 java.util.date 更容易。
在 Joda-Time 中按给定日期进行初始化要容易得多。
Joda-Time 也支持时区。
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/
【讨论】:
以上是关于我应该使用 Java 日期和时间类还是使用像 Joda Time 这样的 3rd 方库?的主要内容,如果未能解决你的问题,请参考以下文章