当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《我应该使用Java日期和时间类,还是使用像JodaTime这样的第三方库?》经验,为你挑选了5个好方法。

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

使用Java日期和时间类与第三方库(如Joda时间)相比有哪些优缺点?我想这些第三方库存在的原因很充分,但我自己从未真正比较过它们.



1> Jon Skeet..:

编辑:既然已经发布了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的日期/时间算法如何工作的规则.在这些之上构建任何东西都是一个坏主意,而不是使用精心设计的库来开始.


@adi:更新 - 它仍然有效,但*希望*JSR-310将成为Java 8的一部分,但它不是Java 7的一部分.
@JonSkeet自从引入java-8以来,这应该会更新
Java 6和7有一个`java.time.*`的backport:http://www.threeten.org/threetenbp/

2> gizmo..:

好吧,除非你打算等待Java 8,希望他们能够实现更好的API来操作日期和时间,是的,请使用Joda-Time.节省时间并避免许多麻烦.



3> oxbow_lakes..:

答案是:这取决于

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

就个人而言,我发现JODA在我需要的复杂性方面迈出了一步.标准java DateCalendar类中的2个主要(IMHO)错误是:

    它们是可变的

    他们将"时间 - 一天"的概念与即时时间混为一谈

虽然这些都是由JODA解决的,但是你会发现很容易为自己的类滚动,YearMonthDay并且Instant它们都使用底层的java类进行实际的"日历"计算.然后,您不必熟悉> 100个类的API,不同的格式化/解析机制等.

当然,如果您确实需要完整表示不同的年表(例如希伯来语)或希望能够定义您自己的想象日历系统(例如,对于您正在编写的游戏),那么JODA或JRS-310可能适合您.如果没有,那么我建议滚动你自己可能是要走的路.

JSR-310规范的领导者是Stephen Colebourne,他在第一名写了JODA,因此将逻辑上取代 JODA.


非IMO应该*不会被非专业人士重新发明.
我也不是白痴,但我仍然遇到Java D&T API的问题.他们很容易被滥用.人们更有可能正确使用Joda的原因是Joda设计得更好 - 它鼓励*你做正确的事情.
在日期/时间API方面,我相信自己的专家可以在一周中的任何一天.这不是一个随机的第三方API,没有其他人使用它."> 100班"的论点是一个稻草人,因为你显然不需要全部学习它们.
我想我们必须同意不同.由专家*和*精心设计的任何可信赖的日期/时间,这避免了我不得不做时间算法的脏工作,从我的角度来看,它被视为"必须拥有".在过去的一年里,我学会了热情地讨厌人类的时间测量.
当Joda存在时滚动自己是一个简单可怕的想法.只是不要这样做.确实,Joda有几十个你不会使用的课程,但答案很简单 - 不要使用你不需要的课程.编写自己的这种类型的库可能会出现很多问题 - 无论是在开发还是在测试中,您必须付出的努力量都是巨大的.或者,您只需添加一个库.然后,Joda还有一个额外的好处,即你的团队的新员工之前可能已经使用过它,但是他们不会使用你自己开发的库.
很难,IMO.另外,Joda时间中DateTimeFormatter的方式是线程安全的,这使得该方面更加愉快.你*不必*学习整个API,当然 - 只需要你需要的东西.文档使这相对容易.日期和时间轮是(续)
虽然,我并不是说我不相信JODA很多人都在使用Maven和Apache Commons Collections:这并不意味着他们不是最高级别的cr @ p!很多人用它==好也是一个稻草人.我的意思是"我不想要依赖,除非我必须"
我不明白为什么JODA时间是一种侵入性依赖 - 它是否带来了许多新的传递依赖?我不认为这样做.另外,我相信库代码超过自己的代码 - 因为在我自己的代码与库代码(我的意思是开源代码)中寻找错误的眼睛较少.
我会说,对于针对Java 7的绿地开发,它将被弃用 - 这远非过时的IMO.开发自己的课程的主要原因*不是*日期和时间处理非常困难.以"绝对正确"的方式使用标准Java类(续)
因此,当您使用SimpleDateFormat时,您是否仔细确保在不锁定的情况下永远不会从多个线程重用相同的实例?您对使用疯狂复杂的Calendar类算术执行操作的顺序有多大信心?为什么不使用专家的知识呢?

4> Anthony Roy..:

这一切都取决于你对日期做了什么.如果您只是坚持它们,那么Java内置的日期可能会完成您想要的所有操作.但是如果你正在进行广泛的时间操作,那么你可能会更好地使用Joda.



5> 小智..:

您应该使用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/

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有