写点什么

Java 8 新的日期与时间 API

  • 2013-01-16
  • 本文字数:1668 字

    阅读完需:约 5 分钟

为了简化与精化 API,在经历了长期的重构工作后,由 Stephen Colebourne 所领导的,旨在替换 Java 复杂的日期 API 的 Java Specification Request( JSR 310 )已经被添加到了 Java 8 的特性列表中,并且预计在这个月发布M6 版本。

日期处理是个复杂的问题,特别是Java 中的日期处理有着不那么光彩的历史。最初的支持是通过java.util.Date 实现的,这是个令人困惑的名字,包含了日期与时间,并且无法实现国际化。此外,它在别的方面也令人沮丧,比如说对属性使用了前后矛盾的偏移量;月份与小时都是基于0,月份中的天数则是基于1,而年则是从1900 开始的。

在1997 年Java 1.1 发布时,它通过JDBC 提供了对SQL 的支持。它也有一个日期,该日期继承自java.util.Date,但却有不同的含义。IBM 在1998 年贡献了一个替代API(java.util.Calendar),可以实现国际化并且提供了很棒的灵活性,但代价却是带来了很大的复杂性,即便对于相对简单的问题来说亦如此。更糟的是,java.util.Date 与java.util.Calendar 中的所有属性都是可变的,这样在从访问器中返回时,Date 类型(或是Time 与Timestamp 类型)的任何属性都需要被克隆一份。

直到2005 年,Stephen Colebourne 的 Joda-Time 库才发布,这个库非常流行并且得到了广泛的使用,它极大程度地改进了 Java 日期库的境遇,但却需要用户使用外部库。JSR 310 构建在这个经验之上,为 Java SE 标准库本身的 java.util.Date 与 java.util.Calendar 提供了替代方案。

310 是个庞大的 API,但使用了一阵后我就发现它前后一致且易于理解。在最新版本中,它通过提供一个高层 API(主要由应用使用)以及一个低层 API(主要由框架及其他场景使用)来处理复杂性问题。比如说,开发者可以通过低层 API 扩展对 date-time 域(YEAR、MONTH、DAY_OF_MONTH 及 HOUR 等)的支持,增加新的域,如“hour-of-fortnight”。

层 API 提供了一系列类,如 ZonedDateTime(用于存储带有时区的日期与时间)、LocalDate、LocalTime 及 LocalDateTime(用于处理“人类”的日期与时间)、还提供了 Instant,用于实现日志等功能所需的时间戳,这类似于 Java.util.Date。所有这些类都是不可变且线程安全的。

现在,JSR 310 已经成为 Java 8 的一部分了,ThreeTen 项目也通过 OpenJDK 建立起来了,用于完成集成工作。提供 310 参考实现的项目托管在 SourceForge 上,源代码位于 GitHub 上。

Java 的日期与时间 API 问题由来已久,这次终于在 Java 8 中进行了彻底的改进,InfoQ 英文站的读者也对此举表达出了自己的看法:

真不错。很高兴看到日期时间 API 终于更新了。这个 API 至少涵盖了 Joda-Time 库的一些特性,然而,我仍旧觉得在真实的使用场景下,诸如工作日 / 非工作日的差别 / 计算等工作还是需要由其他第三方 API 来实现。

事实上,我觉得这是 Java 中最值得期待的特性。SimpleDateFormat 与其他格式化类已经饱受批评,出现了线程安全、重量级、序列化成本高等问题。这可能是 Java 团队的一个机会,可以彻底消灭这些问题,以一个新的开始为 Java 创建优秀的 API。

这个改进来的有些晚,但却是最值得期待的。Java Date API 太丑陋,并且复杂,诸如 joda-time 之类的方式提供了更为强大的日期处理手段。但标准 API 是非常受欢迎的,因为诸如 Hibernate 与 JPA 等框架可以使用标准来进行数据交换。一个常见的问题是当应用分层时,不兼容的技术会导致问题变得复杂。举个例子,标准的 JSF 日期转换器与 joda-time API 就不兼容,你需要编写自己的转换器,但即便如此,primefaces 日期部件也无法兼容于 joda-time,因为他们的实现方式依赖于 java.util.Date 对象。

发布新版的 time-api.jar 如何,它可以反映出 Java 8 的情况?0.6.3 版(其项目主页上的最新版)依然使用老的包名,如果这样做,那么已经提供了支持的软件(比如说 DataNucleus JDO/JPA)就可以在 Java 8 发布前更新了。

我也认为发布新的二进制 jar 包更合适一点,但通过 Ant 脚本我可以轻松地从源代码进行构建。

Java 8 计划在今年 10 月份正式发布。

查看英文原文: New Date and Time API Looks Set for Java 8

2013-01-16 05:183224
用户头像

发布了 88 篇内容, 共 273.1 次阅读, 收获喜欢 9 次。

关注

评论

发布
暂无评论
发现更多内容

第七期 |《实时洞察 智能运营一用友企业绩效管理白皮书》解读

用友BIP

企业绩效

用友全球司库十问(七)|企业如何进行资金计划的经营化管理?

用友BIP

全球司库 资金计划

增长实验室-ab分流的流量保护功能介绍 | 京东云技术团队

京东科技开发者

测试 AB实验 企业号11月PK榜 用户桶位

架构探索之路-第一站-clickhouse | 京东云技术团队

京东科技开发者

数据库 OLAP Clickhouse 企业号11月PK榜

激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相

汀丶人工智能

人工智能 计算机视觉 大语言模型 视觉语言模型

大数据平台红蓝对抗 - 磨利刃,淬精兵! | 京东云技术团队

京东科技开发者

测试 混沌演练 红蓝对抗 企业号11月PK榜

选择美国站群服务器的五大理由:安全、稳定、高效

一只扑棱蛾子

美国站群服务器

CodeWhisperer 一款好玩的 AI 插件

亚马逊云科技 (Amazon Web Services)

Java 人工智能 云上探索实验室 Amazon CodeWhisperer

TDengine 3.0 数据订阅功能的“独家”使用经验,只此一份!

TDengine

tdengine 时序数据库

API测试:了解API接口测试与API接口测试指南

Noah

王文京:行业化经营创造更大的客户价值

用友BIP

解锁数据库运维秘籍:掌握AntDB-T动态共享内存,提升进程间通信效率

亚信AntDB数据库

亚信科技 数据库· AntDB数据库

一种可度量的测试体系-精准测试

鲸品堂

工具 测试 企业号11月PK榜

对话在行人|索通发展:从ERP到BIP,携手用友共创数智索通

用友BIP

企业数智化

可视化:最热的前端Web组态工具

2D3D前端可视化开发

物联网 可视化 组态软件 web组态 组态工具

使用商品详情API接口获取商品数据

Noah

Mac电脑屏幕调节亮度软件 Lunar pro 激活最新版

胖墩儿不胖y

Mac软件 屏幕亮度调整

Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!

汀丶人工智能

向量检索 Milvus 向量数据库

一个干净的前端架构是什么样的?

秃头小帅oi

Java 8新的日期与时间API_Java_Charles Humble_InfoQ精选文章