写点什么

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

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

关注

评论

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

16 K8S之容器健康监测

穿过生命散发芬芳

k8s 11月日更

消息队列表结构设计

guangbao

使用 JavaScript 创建和下载文件

devpoint

JavaScript File Blob 11月日更

【Quarkus技术系列】「云原生架构体系」配置参考指南相关的功能机制配置介绍分析

码界西柚

入门 配置信息 Quarkus 11月日更

自定义View:多点触摸与实现任意拖动图片控

Changing Lin

11月日更

Ta们用数字种植绿色山河:牛津博士与储能之变

脑极体

你找的网络安全系列书籍,都在这了!

喀拉峻

网络安全 安全 信息安全

北鲲云超算携手西安电子科技大学开展高性能计算培训

北鲲云

双十一还是孤身一人?超强AI神器送你一个"对象"

百度大脑

人工智能 百度

进击的Java(八)

ES_her0

11月日更

HW3 - 外包学生管理系统架构文档

WWH

架构实战营

Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)

不脱发的程序猿

Python PyQt GUI 计时器 多线程类和事件处理

11.25直播预告|开源与SaaS水火不容?「观测云-可观测之路」第2期技术大咖为您解惑!

观测云

VR和AR只是入门,真正的元宇宙远不止于此

CECBC

Android C++系列:访问Assets 文件夹

轻口味

c++ android jni 11月日更

Golang Gin 框架参数解析介绍(三)

liuzhen007

11月日更

“元宇宙”到底是啥?为啥火了?鼓励探索警惕忽悠

CECBC

什么是低代码平台?

石云升

低代码平台 11月日更

点进来,与白洞一起体验一场沉浸式智慧轨道之旅

脑极体

Go 语言,测试功能详解 - 下

微客鸟窝

Go 语言 11月日更

Pulsar的Chunk Message原理剖析

Zike Yang

Apache Pulsar 11月日更

linux实战清理挖矿病毒kthreaddi

入门小站

Linux

堪称“高并发”教程天花板的Alibaba《基础+实战+源码+面试+架构》

收到请回复

Java 程序员 后端 java面试

博文推荐 | Apache Pulsar 对现代数据堆栈至关重要的四个原因

Apache Pulsar

kafka 架构 Apache Pulsar 数据堆栈 DataStax

MVCC的机制初识

卢卡多多

MVCC 11月日更

一文讲透自适应熔断的原理和实现

万俊峰Kevin

微服务 熔断 Go 语言 熔断器 限流熔断

NodeJs深入浅出之旅:内存控制(下)🐯

空城机

大前端 Node 11月日更

十月热点:EasyDL八大国产芯片实现模型部署全适配,度目智能门禁机CM-A1重磅发布!

百度大脑

人工智能 百度

译文 | 科普:Pulsar 和 Kafka 架构对比

Apache Pulsar

kafka 架构 分布式 中间件 Apache Pulsar

一个基于DPoS共识算法的区块链案例解析

Regan Yue

区块链 11月日更 细讲区块链

技术改进项目的质量保障思路

QualityFocus

架构 软件测试 自动化测试 质量保障 技术改进

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