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

我知道有关于java.util.Date和Joda-Time的问题。 但经过一番挖掘,我找不到关于java.time API(由JSR 310定义的Java 8中的新增内容)与Joda-Time之间的差异的线索。

我听说Java 8的java.time API比Joda-Time更干净,可以做得更多。 但是我找不到比较两者的例子。

  • java.time能做什么Joda-Time不能做什么?
  • java.time能比Joda-Time做得更好吗?
  • java.time的性能更好吗?

  • 共同特征

    a)这两个库都使用不可变类型。 Joda-Time还提供了其他可变类型,如MutableDateTime

    b)另外:两个图书馆的灵感来自Eric Evans的设计研究“TimeAndMoney”或者Martin Fowler关于领域驱动风格的想法,所以他们或多或少地为流畅的编程风格而努力(尽管并不总是完美的;-))。

    c)对于这两个库,我们得到一个真实的日历日期类型(称为LocalDate ),一个真实的墙壁时间类型(称为LocalTime )和组合(称为LocalDateTime )。 与旧的java.util.Calendarjava.util.Date相比,这是一个非常大的胜利。

    d)这两个库都使用以方法为中心的方法,这意味着它们鼓励用户使用getDayOfYear()而不是get(DAY_OF_YEAR) 。 与java.util.Calendar相比,这会导致很多额外的方法(尽管后者由于过多使用ints而不是类型安全的)。

    性能

    尽管第3点(异常捕捉)可能已经过时,请参阅@OO7的其他答案,指向Mikhail Vorontsov的分析 - 请参阅此JDK错误。 不同的性能(这通常有利于JSR-310)主要是由于Joda-Time的内部实现总是使用类似机器时间的长基元(以毫秒为单位)。

    空值

    Joda-Time经常使用NULL作为系统时区,默认语言环境,当前时间戳等的默认值,而JSR-310几乎总是拒绝NULL值。

    精确

    JSR-310处理纳秒精度,而Joda-Time精确度限于毫秒。

    支持的字段:

    有关Java-8(JSR-310)中支持的字段的概述由temporal-package中的某些类(例如ChronoField和WeekFields)给出,而Joda-Time在此区域相当薄弱 - 请参阅DateTimeFieldType。 乔达时代最大的缺点就是缺乏本地化的周相关领域。 两种字段实现设计的共同特点是都基于long类型的值(没有其他类型,甚至没有枚举)。

    枚举

    JSR-310提供像DayOfWeekMonth这样的枚举,而Joda-Time并没有提供这个功能,因为它主要是在Java 5之前的2002 - 2004年开发的。

    区域API

    a)JSR-310比Joda-Time提供更多的时区功能。 后者无法产生对时区偏移转换历史的编程访问权限,而JSR-310可以执行此操作。

    b)获取信息:JSR-310已将其内部时区存储库移至新位置和不同格式。 旧的库文件夹lib / zi不再存在。

    调节器与属性

    JSR-310引入了TemporalAdjuster作为外部化时间计算和操作的形式化方法,特别是对于库或框架编写者来说,这是嵌入JSR-310的新扩展的一种很好且相对容易的方式(一种相当于静态前java.util.Date辅助类)。

    然而对于大多数用户来说,这个功能的价值非常有限,因为编写代码的负担仍然与用户有关。 基于新的TemporalAdjuster概念的内置解决方案并不多,目前只有辅助类TemporalAdjusters具有有限的一组操作(以及枚举Month或其他时间类型)。

    Joda-Time提供了一个现场软件包,但实践证明,新的现场实施非常难以编码。 另一方面,Joda-Time提供了所谓的属性,它使得一些操作比JSR-310更容易和更优雅,例如property.withMaximumValue()。

    日历系统

    JSR-310提供4个额外的日历系统。 最有趣的是Umalqura(沙特阿拉伯使用)。 另外三个是:民国(台湾),日本(只有1871年以来的现代历法!)和泰国佛教(只在1940年后才是正确的)。

    Joda-Time提供基于计算基础的伊斯兰教日历 - 而不是像Umalqura这样以瞄准为基础的日历。 Joda-Time也以类似的形式提供泰国佛教,民国和日本的佛教。 否则,乔达时代也提供了科普特和ethiopic日历(但没有任何国际化的支持)。

    欧洲人更感兴趣:Joda-Time还提供格里历,朱利安和混合格利高里历。 然而,真正的历史计算的实际价值是有限的,因为不同年份开始的重要特征根本不被支持(同样的批评对于老的java.util.GregorianCalendar是有效的)。

    其他日历如希伯来语或波斯语或印度语在两个图书馆都完全缺失。

    时代的日子

    JSR-310具有JulianFields类,而Joda-Time(2.0版)在类DateTimeUtils中提供了一些辅助方法。

    JSR-310没有接口(一个设计错误),而是一个可以用于任何时钟依赖注入的抽象类java.time.Clock 。 Joda-Time在DateTimeUtils中提供了接口MillisProvider和一些辅助方法。 所以这样,Joda-Time也可以支持不同时钟的测试驱动模型(嘲讽等)。

    持续时间算术

    两个库都支持以一个或多个时间单位计算时间距离。 然而,当处理单个单位持续时间时,JSR-310风格明显更好(并且基于long而不是int):

    JSR-310 => long days = ChronoUnit.DAYS.between(date1, date2);

    Joda-Time => int days = DAYS.daysBetween(date1, date2).getDays();

    处理多单位持续时间也是不同的。 即使计算结果可能不同 - 请参阅此封闭的Joda-Time问题。 尽管JSR-310使用非常简单且有限的方法来使用类Period (基于年,月和日的Duration )和Duration (基于秒和纳秒),但Joda-Time使用更复杂的方式使用类PeriodType为了控制哪个单位的持续时间(Joda-Time称之为“期间”)应该被表达。 尽管PeriodType -API在某种程度上使用类似的方法很尴尬,但JSR-310根本不提供这种方法。 特别是在JSR-310中尚不可能定义混合的日期和时间持续时间(例如基于日期和小时数)。 因此,如果涉及从一个图书馆迁移到另一个图书馆,请注意。 讨论中的图书馆是不相容的 - 尽管部分名称相同。

    间隔

    JSR-310不支持此功能,而Joda-Time只提供有限的支持。 另请参阅此SO-answer。

    格式化和分析

    比较这两个库的最好方法是查看等同名称的类DateTimeFormatterBuilder(JSR-310)和DateTimeFormatterBuilder(Joda-Time)。 JSR-310变体稍微强大一些(也可以处理任何类型的TemporalField只要字段实现者已设法编译一些扩展点,如resolve())。 然而,最重要的区别是 - 在我看来:

    JSR-310可以更好地解析时区名称(格式模式符号z),而Joda-Time在其早期版本中根本无法完成此操作,现在只能采用非常有限的方式。

    JSR-310的另一个优点是支持独立的月份名称,这在俄语或波兰语等语言中很重要.Joda-Time无法访问这些资源 - 即使在Java-8平台上也是如此。

    JSR-310中的模式语法也比Joda-Time更灵活,允许使用可选部分(使用方括号),更注重CLDR标准并提供填充(字母符号p)和更多字段。

    否则应该注意的是,Joda-Time可以使用PeriodFormatter格式化持续时间。 JSR-310不能做到这一点。


    希望这个概述有帮助。 所有收集的信息主要是由于我的努力和调查,如何设计和实施更好的日期和时间库(没有什么是完美的)。

    2015-06-24更新:

    同时,我已经找到了编写和发布Java中不同时间库的表格概述的时间。 这些表格还包含Joda-Time v2.8.1和Java-8(JSR-310)之间的比较。 它比这篇文章更详细。


    Java 8日期/时间:

  • Java 8类是围绕着人类的时间而建立的。 它使他们快速进行人类日期时间算术/转换。
  • 日期/时间组件getter getDayOfMonth在Java 8实现中具有O(1)复杂性。
  • 在Java 8 ea b121中解析OffsetDateTime / OffsetTime / ZonedDateTime的速度非常缓慢, ZonedDateTime是由于在JDK内部抛出并捕获到异常。
  • 一组包: java.time.*java.time.chrono.*java.time.format.*java.time.temporal.*java.time.zone.*
  • 时间戳(时间戳)日期和时间部分日期和时间分析器和格式化器时区不同的年表(日历)。
  • 现有的类有问题,如日期不支持I18N或L10N。 他们是可变的!
  • 更简单和更强大。
  • 时钟可以被注入。
  • 时钟可以创建各种属性 - 静态时钟,模拟时钟,低精度时钟(整秒,整分钟等)。
  • 时钟可以用特定的时区创建。 Clock.system(Zone.of("America/Los_Angeles"))
  • 使代码处理日期和时间可测试。
  • 使测试独立于时区。
  • 乔达时间:

  • Joda-Time正在使用机器时间。 基于int / long值的手动实现会更快。
  • Joda-Time获得者需要计算每个获得者呼叫的计算机到人类的时间,这使得Joda-Time成为这种情况下的瓶颈。
  • 它由不可变类组成,它处理Instants,Date&Time,Partials和Durations它是灵活的它设计得很好。
  • 将日期表示为即时。 但日期和时间可能对应于多个瞬间。 夏令时结束时重叠小时。 以及没有任何对应于它的瞬间。 白天开始时的间隔时间。 必须对简单操作执行复杂的计算。
  • 接受空值作为其大多数方法的有效值。 导致微妙的错误。
  • 有关更详细的比较,请参阅: -

    Java 8日期/时间库性能(以及Joda-Time 2.3和juCalendar)。 &Java中的新日期和时间API 8

    链接地址: http://www.djcxy.com/p/36721.html

    上一篇: Differences between Java 8 Date Time API (java.time) and Joda

    下一篇: JavaScript difference between two Date()'s in months