我正在创建一个基于网络的系统,该系统将在世界各国使用.必须存储的一种数据是日期和时间.
使用Java日期和时间类与第三方库(如Joda时间)相比有哪些优缺点?我想这些第三方库存在的原因很充分,但我自己从未真正比较过它们.
编辑:既然已经发布了Java 8,如果可以使用它,那就这样做吧!java.time
在我看来,比Joda Time更清洁.但是,如果您在Java-8之前遇到困难,请继续阅读......
Max询问使用Joda的优缺点......
优点:
它很有效.我强烈怀疑Joda中的bug比标准Java库少得多.由于设计的原因,Java库中的一些错误很难(如果不是不可能)修复.
它的目的是鼓励你以正确的方式思考日期/时间处理 - 将"当地时间"的概念分开(例如"无论我在哪里,都在早上7点叫醒我")和即时("我正在呼唤詹姆斯"太平洋标准时间下午3点;它可能不是下午3点,但它是同一时刻")
我相信它可以更容易地更新时区数据库,它确实会相对频繁地更改
它具有良好的不变性的故事,这让生活很多容易IME.
从不变性开始,所有格式化程序都是线程安全的,这很好,因为您几乎总是希望通过应用程序重用单个格式化程序
你将有机会java.time
在Java 8中学习,因为它们至少有点类似
缺点:
这是另一个要学习的API(虽然文档相当不错)
这是另一个构建和部署的库
当您使用Java 8时,仍然需要一些工作来迁移您的技能
我过去没有DateTimeZoneBuilder
有效地使用它.这是一个非常罕见的用例.
为了回应oxbow_lakes有效构建自己的小API的想法,以下是我对为什么这是一个坏主意的看法:
这是工作.为什么工作已经为你完成了?
对于您的团队来说,新手更熟悉Joda而不是您自己开发的API
除了最简单的用途之外,你可能会犯错误...即使你最初认为你只需要简单的功能,这些东西也有一种变得越来越复杂的习惯,一次只有一点点.操作日期和时间很难正确.此外,内置的Java API很难正确使用 - 只需查看日历API的日期/时间算法如何工作的规则.在这些之上构建任何东西都是一个坏主意,而不是使用精心设计的库来开始.
好吧,除非你打算等待Java 8,希望他们能够实现更好的API来操作日期和时间,是的,请使用Joda-Time.节省时间并避免许多麻烦.
答案是:这取决于
JODA(和JSR-310)是一个功能齐全的日期/时间库,包括支持多个日历系统.
就个人而言,我发现JODA在我需要的复杂性方面迈出了一步.标准java Date
和Calendar
类中的2个主要(IMHO)错误是:
它们是可变的
他们将"时间 - 一天"的概念与即时时间混为一谈
虽然这些都是由JODA解决的,但是你会发现很容易为自己的类滚动,YearMonthDay
并且Instant
它们都使用底层的java类进行实际的"日历"计算.然后,您不必熟悉> 100个类的API,不同的格式化/解析机制等.
当然,如果您确实需要完整表示不同的年表(例如希伯来语)或希望能够定义您自己的想象日历系统(例如,对于您正在编写的游戏),那么JODA或JRS-310可能适合您.如果没有,那么我建议滚动你自己可能是要走的路.
JSR-310规范的领导者是Stephen Colebourne,他在第一名写了JODA,因此将逻辑上取代 JODA.
这一切都取决于你对日期做了什么.如果您只是坚持它们,那么Java内置的日期可能会完成您想要的所有操作.但是如果你正在进行广泛的时间操作,那么你可能会更好地使用Joda.
您应该使用Joda-Time库,因为:
Joda-Time支持ISO 8601标准,这是
日期表示的标准方式.
在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/