写点什么

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:183205
用户头像

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

关注

评论

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

大规模团队中的敏捷测试实践

刘冉

敏捷测试

百变小精灵,CRMEB Java 单商户系统也要当!

CRMEB

git pull 和 git fetch到底什么区别?

Jackpop

代码版本控制用SVN还是Git好?

Jackpop

OpenIM重大升级-群聊读扩散模型发布 群管理功能升级

Geek_1ef48b

Qt|模仿文字浮动字母

中国好公民st

qt 7月月更

IntelliJ IDEA,有点强!

Jackpop

这些 C++ 开源代码,简直绝了!

Jackpop

OpenIM重大优化-消息按需加载 一致性缓存 uniapp发布

Geek_1ef48b

12张图+6K字图解ZGC垃圾回收器及调优技巧

程序员小毕

程序员 面试 程序人生 ZGC JVM

java零基础入门-异常、线程(完结篇)

喵手

Java 7月月更

C# 线程锁和单多线程简单使用

IC00

C# 7月月更

.so 将c++转化为安卓可使用的数据

小肉球

qt 7月月更

SpringBoot项目使用Tomcat为什么让大厂禁止?

Java程序员

Java 程序员 Sprint Boot

软件质量体系之思

刘冉

质量体系

自研的数据产品迭代了一年多,为什么不买第三方商业数据平台产品呢?

金松(李博源)

数据中台 数据产品经理 数字化转型 数据产品

算法题每日一练---第6天:李白打酒

知心宝贝

算法 前端 后端 7月月更

数据治理浅析

五分钟学大数据

数据治理 7月月更

工业物联网中的时序数据

CnosDB

物联网 时序数据库 开源社区 CnosDB 工业数据

面试官:MySQL 数据库查询慢,除了索引问题还可能是什么原因?

Java全栈架构师

Java MySQL 数据库 面试 后端

JavaScript 中如何取消请求

掘金安东尼

JavaScript 前端 7月月更

【刷题记录】19. 删除链表的倒数第 N 个结点

WangNing

7月月更

云原生(十一) | Kubernetes篇之Kubernetes原理与安装

Lansonli

云原生 k8s 7月月更

阿里二面:什么是CAS?

Java永远的神

Java 程序员 面试 程序人生 CAS

LeetCode-83. 删除排序链表中的重复元素(java)

bug菌

Leet Code 7月月更

Vim到底可以配置得多漂亮?

Jackpop

C#入门系列(二十八) -- LINQ的查询语法

陈言必行

7月月更

7大专题详解SpringBoot,阿里这套SpringBoot全栈笔记真香

Java永远的神

Java 程序员 面试 程序人生 springboot

前端性能优化之请求优化

南城FE

性能优化 前端 7月月更

腾讯云获国际专业流媒体测评肯定:三大场景下视频编码性能全部最优

科技热闻

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