写点什么

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

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

关注

评论

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

阿里P8架构师3年心血终成的453页神级Java系统分析与架构设计文档

Java你猿哥

Java ssm 架构师 面经 Java系统性能

Apache IoTDB v1.1.0 发布|增加多种分段方式与实用函数,引入 pipeline 执行引擎进一步提升查询速度

Apache IoTDB

OpenHarmony标准系统开机时长优化

OpenHarmony开发者

OpenHarmony

你的 Kubernetes 安全吗?最新benchmark的重要趋势解读

HummerCloud

Kubernetes k8s

浅析云原生时代的服务架构演进

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

【直播回顾】数字化转型成为银行业发展的关键(上)

易观分析

金融 银行 经济

OpenTiny 跨端、跨框架组件库升级TypeScript,10万行代码重获新生

华为云开发者联盟

Vue 前端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

Docker教程:如何将Helix QAC创建为一个容器并运行?

龙智—DevSecOps解决方案

Docker 容器 Helix QAC 静态代码扫描

如何成为一名数据分析师(一)——面试准备

Data 探险实验室

数据分析 数据 数据可视化 数据分析师

【四大分主题,九次干货分享】去哪儿网“云原生”系列分享即将开讲!!

Qunar技术沙龙

云原生 去哪儿网

一个前端大佬的十年回顾 | 漫画前端的前世今生

京东科技开发者

JavaScript html 前端 京东云 企业号 4 月 PK 榜

从Spring的AOP看Synchronized锁失效和事务失效的情况

Java你猿哥

spring ssm synchronized Java工程师

GreatSQL社区月报 | 2023.03

GreatSQL

greatsql greatsql社区

期盼已久的“库权限”来了

NineData

数据库 安全 数据 开发 权限管理

科学的演变:从笛卡尔到生成式人工智能

Baihai IDP

人工智能 AIGC 企业号 4 月 PK 榜

使用 App Store Connect API v2.3 管理 App Store 新定价机制

37手游iOS技术运营团队

ios iap In App Purchase App Store Connect API app store

MySQL中,SQL 查询总是先执行SELECT语句吗?

Java你猿哥

Java MySQL sql ssm

聊聊ChatGPT

炜娓道来程序人生

AI ChatGPT

穿云鉴智 - HashiCorp 创始人对于 AI 大模型的思考

Bytebase

人工智能 DevOps

火山引擎云原生数据仓库ByteHouse技术白皮书V1.0(上)

字节跳动数据平台

大数据 数据仓库 云原生 实时数仓 企业号 4 月 PK 榜

4月飞桨国赛火热报名中!产业级赛题和免费硬件,等你来拿

飞桨PaddlePaddle

飞桨

你知道什么是“XY Problem”吗?-【避坑指南】

炜娓道来程序人生

架构 职场 沟通 工作哲学 思维

用友开发者中心应用构建实践指引(二):如何实现入职申请单功能?

YonBuilder低代码开发平台

从 OSPO 角度思考开源治理问题——蚂蚁集团开源办公室负责人边思康

开源雨林

极光笔记 | 如何在Shopify中使用EngageLab (下)

极光JIGUANG

市场营销 用户运营

Redis管道

京茶吉鹿

nosql redis pipeline

绝了!阿里大佬的"Redis深度核心笔记",从基础到源码,全是精华

Java你猿哥

Java redis 面试 面经 春招

软件测试丨ChatGPT的火爆对测试人员来说,是机遇还是挑战?

测试人

软件测试 ChatGPT

软件测试丨河南工业大学“火焰杯”软件测试开发选拔赛颁奖仪式

测试人

低至200元/月,火山引擎DataLeap帮你搭建企业级数据中台

字节跳动数据平台

数据中台 数据集成 促销 数字化建设 企业号 4 月 PK 榜

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