Java SE 9中的Java Time(JSR-310)增强功能

157 阅读4分钟

java.time.* API(JSR-310)被添加到了Java SE 8中,但从那时起又发生了什么?

Java SE 9中的Java Time

目前有117个java时间问题被针对到Java SE 9中。其中大部分不是特别有趣,Javadoc中的很多错误需要修复。下面是一些有趣的内容。

主要的改进

JDK-8146218- 增加LocalDate.datesUntil方法产生流: 增加了两个新方法--LocalDate.datesUntil(LocalDate)LocalDate.datesUntil(LocalDate,Period) --返回一个日期流。

JDK-8068730- 提高Clock.systemUTC()的精度:
Java中的时钟 -System.currentTimeMillis() - 自Java首次发布以来一直以毫秒为单位。在Java SE 9中,Clock 的用户将看到更高的精度,具体取决于操作系统的可用时钟。

JDK-8071919- Clock.tickMillis(ZoneId zone)方法: 随着系统时钟现在返回更高的精度,增加了一个新的方法 -Clock.tickMillis(ZoneId) - 削减了额外的精度,恢复了Java SE 8的毫秒计时行为。

JDK-8030864- 在 java.time 中增加了高效的 getDateTimeMillis 方法: 这增加了两个名为epochSecondChronology 的方法,这两个方法没有创建对象,可以将日期-时间字段转换为历时秒。

JDK-8142936- 天、小时、分钟、秒等的持续时间方法: Duration 的 Java SE 8 API 对于某些用例来说是不完整的。这一修改增加了一系列新方法,允许可靠地返回部分期限。

JDK-8148849- 截断持续时间: 增加了一个方法Duration.truncatedTo(TemporalUnit) ,以允许截断,类似于Instant 上的现有方法。

JDK-8032510- 增加Duration.dividedBy(Duration). 一个新的方法,允许一个持续时间被另一个持续时间所除。

JDK-8133079- LocalDate 和 LocalTime ofInstant() 工厂方法。 在LocalDateLocalTime 中添加新的工厂方法,以简化从Instant 的转换

JDK-8143413- 增加toEpochSecond方法,以提高访问效率。 在LocalDate,LocalTimeOffsetTime 中增加方法,以优化对纪元-秒的转换

格式化

JDK-8148947- DateTimeFormatter模式字母'g'。 这为修改后的儒略日增加了一个模式字母。

JDK-8155823- 增加日期时间模式'v'和'vvvv'。 这增加了对CLDR定义的时区的 "通用非地点 "格式的支持,如 "太平洋时间"(该格式忽略夏令时)。 还为格式化生成器增加了方法 -DateTimeFormatterBuilder.appendGenericZoneText().

JDK-8066806- DateTimeFormatter不能解析带个位数小时的偏移量。 Formatter已扩展到支持另外11种时区偏移格式,包括个位数小时,如+2:00。

JDK-8031085- DateTimeFormatter不能解析格式 "yyyyMMddHHmmssSSS"。 这扩展了对相邻值解析的支持,使其支持分数。在 Java SE 8 中,这样的模式看起来应该工作,但却不工作,而在 Java SE 9 中,它就是工作。

JDK-8145633- 本地化模式的邻接值解析。 这将邻接值解析的支持扩展到本地化模式,如基于周的年份和年的一周。

JDK-8148949- DateTimeFormatter模式字母'A','n','N'. 这些模式被修改为更灵活,产生的错误更少。

性能

JDK-8073394- Clock.systemUTC()应该返回一个常数。 这一改变避免了在使用Clock

JDK-8074003- ZoneRules.getOffset(Instant)可以被优化。 这一变化减少了查找时区数据时的对象流失。

JDK-8074002- ZoneId.systemDefault()应该更快。 这项改进使用了一种巧妙的方法,在处理TimeZone.setDefault 时缓存时区

JDK-8068803- LocalDate.plusDays的性能可以更好。 这针对增加少量天数的常见情况,优化了LocalDate.plusDays

JDK-8066291- ZoneIdPrinterParser可以得到优化。 方法ZoneRulesProvider.getAvailableZoneIds() 现在返回一个不可变的集合,而不是一个可变的集合。由于大多数用户代码调用ZoneRules.getAvailableZoneIds() ,所以不会受到影响。

谢谢

感谢所有这些错误修复和增强功能的贡献者,包括Oracle内部和外部的贡献者。 (我主要是作为一个审查者,而不是作者,这在总体上是非常有效的。)

总结

java.time.* ,继续向前推进。欢迎任何反馈或其他改进建议!