写点什么

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

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

关注

评论

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

哈尔滨等保测评:周期与费用

等保测评

训练“系统级思维”,听时序数据库 IoTDB Committer 说说从设计到应用的成长

Apache IoTDB

IPv6改造技术:隧道技术的原理和优缺点

防火墙后吃泡面

CST软件基础一:建模的方式与材料属性设置

思茂信息

cst电磁仿真 CST软件 CST Studio Suite

非凸科技钻石赞助RustChinaConf 2025 & Rust Global China大会

非凸科技

区块链U卡APP的开发需求

北京木奇科技有限公司

区块链开发 web3开发 APP开发公司

区块链U卡APP开发的技术难点

北京木奇科技有限公司

区块链开发 软件外包公司 web3开发

(一)3.1.9 生产“稳”担当:Master 服务启动源码全方位解析

白鲸开源

大数据 开源 科技 Apache DolphinScheduler 任务调度

企业内训 | 构建高效智能测试团队,实现从传统到智能化升级

测试人

人工智能 软件测试

YashanDB数据库在大数据环境下的优化技巧

数据库砖家

图思维胜过链式思维:JGraphlet构建任务流水线的八大核心原则

qife122

Java 任务流水线

原生APP与H5开发的对比分析

北京木奇科技有限公司

APP开发 软件外包公司 APP外包公司

YashanDB数据库在大数据时代的变革与发展机遇

数据库砖家

LED视频墙租赁和传统投影6大区别

Dylan

活动 LED LED display 舞台表演 LED屏幕

从MESA模型到锁升级:synchronized性能逆袭的底层逻辑

poemyang

并发编程 Java并发编程

跨境商家怎么精准找到目标消费群体,开拓新市场?

Wolink

跨境电商 海外推广 品牌出海 沃链Wolink 达人营销

智能问数 Agent 如何确保 SQL 生成 100% 准确?

Aloudata

数据分析 大模型 指标平台 ChatBI 智能问数

spirv 的指针

Miracle

vivo 浏览器福利体系架构演进之路

vivo互联网技术

后端 数据一致性 可扩展 超大流量 可复制

(二)3.1.9 生产“稳”担当:Apache DolphinScheduler Worker 服务源码全方位解析

白鲸开源

大数据 开源 源码解析 Apache DolphinScheduler 任务调度

AI低代码MES:破解电线电缆行业管理的五大痛点

万界星空科技

数字化管理 mes 万界星空科技mes 电线电缆mes AI低代码MES

YashanDB数据库在大数据环境中的应用价值解析

数据库砖家

上下文工程实施过程中会遇到什么挑战?有哪些优化策略?

Baihai IDP

AI LLM AI Agent 上下文工程

即时通讯安全篇(三):一文读懂常用加解密算法与网络通讯安全

JackJiang

网络编程 即时通讯 IM

Qwen 发布高精度实时音视频同传模型;AirPods 实时翻译功能新增中文丨日报

声网

YashanDB数据库在大数据时代的核心竞争力探讨

数据库砖家

YashanDB数据库在大数据时代的实用价值解析

数据库砖家

2025年9月应用指南 | Smartbi AIChat 白泽,企业级 AI Agent 智能体新一代分析工具

新消费日报

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