Java 8 Date Time API(java.time)和Joda-Time之间的区别

问题:

我知道有关于java.util.Date和Joda-Time的问题。但是在一些挖掘之后,我找不到关于java.time APIJava 8中的新增,JSR 310定义)和Joda-Time之间的差异的线索
我听说Java 8的java.time API非常干净,可以比Joda-Time做得更多。但是我找不到比较这两个的例子。

  • Joda-Time不能做什么java.time?
  • 什么可以比雅达时间更好?
  • java.time的性能是否更好?

回答:

 共同特征
a)这两个库都使用不可变类型。 Joda-Time还提供其他可变类型,如MutableDateTime
b)此外:这两个图书馆都受到设计研究“TimeAndMoney” from Eric EvansMartin Fowler about domain driven style的想法的启发,所以他们或多或少地争取fluent programming style(虽然不总是完美;-))。
c)对于这两个库,我们得到一个真实的日历日期类型(称为LocalDate),一个真正的墙时间类型(称为LocalTime)和组合(称为LocalDateTime)。与旧的java.util.Calendarjava.util.Date相比,这是一个非常大的胜利
d)这两个库都使用以方法为中心的方法,这意味着他们鼓励用户使用getDayOfYear()而不是get(DAY_OF_YEAR)。与java.util.Calendar相比,这导致了很多额外的方法(尽管后者由于过度使用int而不是类型安全的)。
 性能
请参阅@ OO7的另一个答案,指出对Mikhail Vorontsov的分析,尽管第3点(异常捕获)可能已经过时了 – 参见this JDK-bug。不同的表现(对JSR-310的普遍好处)主要是由于Joda-Time的内部实现总是使用机器时间的长基元(以毫秒为单位)。
 空值
Joda-Time通常使用NULL作为系统时区,默认语言环境,当前时间戳等的默认值,而JSR-310几乎总是拒绝NULL值。
 精确
JSR-310处理nanosecond精度,而Joda-Time限制为millisecond精度。
 支持的字段:
Java-8(JSR-310)中的支持字段的概述由时间包(例如ChronoFieldWeekFields)中的某些类给出,而Joda-Time在该区域相当弱 – 参见DateTimeFieldType 。雅培时代最缺乏的就是缺少本地化的周相关领域。两个现场实现设计的一个共同特征是两者都基于long类型的值(没有其他类型,甚至不是枚举)。
 枚举
JSR-310提供enums DayOfWeekMonth,而Joda-Time不提供此功能,因为它主要是在2002 – 2004年之前开发的Java 5
 Zone API
a)JSR-310提供比Joda-Time更多的时区功能。后期无法产生程序访问时区偏移转换的历史,而JSR-310能够做到这一点。
b)对于您的信息:JSR-310已将其内部时区存储库移动到新位置和不同的格式。旧的库文件夹lib / zi不存在。
 调整与物业
JSR-310引入了TemporalAdjuster接口作为外部化时间计算和操作的一种形式化方式,特别是对于库或框架编写者来说,这是一种很好的相对简单的方式来嵌入JSR-310的新扩展(一种等效的到前java.util.Date的静态助手类)。
然而,对于大多数用户而言,该功能的价值非常有限,因为编写代码的负担仍然在于用户。基于新的TemporalAdjuster概念的内置解决方案不是很多,目前只有辅助类(1)具有有限的操作(和枚举Month或其他时间类型)。
Joda-Time提供了一个现场包,但实践证明新的现场实现很难编码。另一方面,Joda-Time提供所谓的属性,使得一些操作比JSR-310更容易和更优雅,例如property.withMaximumValue()
 日历系统
JSR-310提供4个额外的日历系统。最有趣的是Umalqura(在沙特阿拉伯使用)。另外3个是:Minguo(台湾),日本(仅1871年以来的现代日历!)和ThaiBuddhist(仅在1940年之后才正确)。
Joda-Time基于计算基础提供Islamic calendar,而不是像Umalqura这样的瞄准式日历。泰国佛教徒也由Joda-Time以类似的形式提供,Minguo和日本人也没有。否则,Joda-Time也提供科普和埃塞俄比亚历法(但不支持国际化)。
对于欧洲人来说,更有趣的是:Joda-Time还提供了一个GregorianJulian和混合的 – gregorian-julian日历。然而,真正的历史计算的实际价值是有限的,因为在日期历史中开始的不同年份的重要特征根本不受支持(同样的批评对旧的java.util.GregorianCalendar有效)。
其他日历(如HebrewPersianHindu)在两个库中都完全丢失。
 大纪元日
JSR-310具有类JulianFields,而Joda-Time(2.0版)在类DateTimeUtils中提供了一些帮助方法
 
JSR-310没有接口(设计错误),但抽象类java.time.Clock可用于任何时钟依赖注入。 Joda-Time在DateTimeUtils中提供了界面MillisProvider和一些帮助方法。所以这样Joda-Time也能够支持具有不同时钟(嘲笑等)的测试驱动型号。
 持续时间算术
两个库都支持在一个或多个时间单位中计算时间距离。然而,当处理单个持续时间时,JSR-310风格显然更好(而且基于长期而不是使用int):
JSR-310 => long days = ChronoUnit.DAYS.between(date1, date2);
Joda-Time => int days = DAYS.daysBetween(date1, date2).getDays();
处理多单位持续时间也是不同的。即使计算结果也可能不同 – 请看这封闭的Joda-Time issue。虽然JSR-310使用非常简单有限的方法来仅使用类Period(基于年,月和日)的持续时间和Duration(基于秒和纳秒),但Joda-Time使用更复杂的方式使用为了控制在哪个单位持续时间(Joda-Time称之为“时期”)的类PeriodType。尽管JSR-310并不提供使用类似方式的PeriodType -API尴尬。特别是在JSR-310中不可能定义混合的日期和时间(例如以天和小时为单位)。因此,如果涉及从一个图书馆到另一个图书馆的迁移,请警告。讨论中的图书馆是不兼容的 – 尽管类名相同。
 间隔
Joda-Time支持有限,JSR-310不支持此功能。另见SO-answer
 格式化和解析
比较两个库的最佳方式是查看同名的类DateTimeFormatterBuilder(JSR-310)和DateTimeFormatterBuilder(Joda-Time)。 JSR-310变体更强大(也可以处理任何类型的TemporalField,只要领域实现者已经设法编写了一些扩展点,如resolve())。但最重要的区别是 – 在我看来:
JSR-310可以更好地解析时区名称(格式模式符号z),而Joda-Time在其早期版本中根本无法做到这一点,现在只能以非常有限的方式。
JSR-310的另一个优点是支持独立的月份名称,这在俄语或波兰语等语言中是重要的.Joda-Time具有no access to such resources – 甚至不在Java-8平台上。
JSR-310中的模式语法也比Joda-Time更灵活,允许可选部分(使用方括号),更符合CLDR标准,并提供填充(字母符号p)和更多字段。
否则应该注意,Joda-Time可以使用PeriodFormatter格式化持续时间。 JSR-310无法做到这一点。
希望这个概述有帮助。所有收集的信息主要是由于我的努力和调查如何设计和实施一个更好的日期库(没有什么是完美的)。
 2015-06-24更新:
同时我发现有时间为Java写入不同的时间库publish a tabular overview。这些表还包含了Joda-Time v2.8.1和Java-8(JSR-310)之间的比较。它比这篇文章更详细。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Differences between Java 8 Date Time API (java.time) and Joda-Time

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

33 + = 40