写点什么

Date4j,一个简约的日期处理类库

  • 2011-12-04
  • 本文字数:1658 字

    阅读完需:约 5 分钟

Java 本身的日期类在 JDK1.0 版本之后就再也没有更新过,同时还存在着一些众所周知的问题(例如1 月从0 开始,导致了很多月份差一的漏洞)。一份新的Java 规范请求(JSR,Java Specification Request)已经被提交,目的就是要解决上述问题,此版本的类库仍处在 Alpha 版本。在其稳定之前,很多开发者还是会使用 Joda Time 类库,该类库与 JSR-310 的参考实现类似(但不完全相同)。

Date4j 为在 Java 中处理日期提供了一套新的解决方案,但与 Joda Time 所关注的范围完全不同。对比如下:

Joda Time Date4j 拥有的类的数量: 140+ 拥有的类的数量 < 10 包含可变和不可变类 仅包含不可变类 强调速度和功能 强调简单和有效 支持格里高里历(Gregorian)、 科普特语日历(Coptic)、 伊斯兰教历(Islamic)、佛历(Buddhist)等等 只提供对格里高里历的支持 可以完全取代 JDK 日期类 和 JDK 日期类配合使用 精确到毫秒级操作 支持到纳秒(十亿分之一秒)级操作 修复了天“溢出”的问题 天“溢出”的问题可配置 针对的是通常意义的日期维护 适用于通过数据库来维护的日期 采用 Apache 2.0 授权许可 采用 BSD 授权许可虽然乍一看 Date4j 只具备了 Joda 中一部分的特性,但它有两个主要的特点是 Joda 所不具备的。

首先,Date4j 的开发者宣称类库不应莫名其妙地将日期截断。Joda 只支持毫秒级的精度而且在将来可能也不会改善。一些数据库也已经有了更好的解决方案。比如流行的 PostgreSQL 数据库对时间戳精度就已经支持到微秒级(百万分之一秒)。Date4j 可在处理日期时对精度毫无损伤。

第二个特征是日期“溢出”的问题,例如向某个日期增加一段时间后,日期落在下月的情况。最简单的例子就是在 3 月 31 日增加一个月的计算:

复制代码
DateTime dt = new DateTime("2011-03-31");
DateTime result = dt.plusMonths(1);
System.out.println(result.toString());

当使用 Joda Time 时,会输出 4 月 30 日,但这也许并不是你想要的结果。

鉴于这种不确定性,Date4j 为您提供了 4 种选择

  1. 第一天 2. 最后一天(与 Joda Time 相同) 3. 日期顺延 4. 抛出异常以下通过举例的实例来说明,用 Date4j 替换 Joda 后的输出差异:
复制代码
DateTime dt1 = new DateTime("2011-03-31");
DateTime result1 = dt1.plus(0,1,0,0,0,0,DayOverflow.FirstDay);
System.out.println(result1.toString());
// 会输出 2011-05-01 (5 月的第一天)
DateTime dt2 = new DateTime("2011-03-31");
DateTime result2 = dt2.plus(0,1,0,0,0,0,DayOverflow.LastDay);
System.out.println(result2.toString());
// 会输出 2011-04-30(4 月 30 日,与 Joda 输出结果相同)
DateTime dt3= new DateTime("2011-03-31");
DateTime result3 = dt3.plus(0,1,0,0,0,0,DayOverflow.Abort);
System.out.println(result3.toString());
// 抛出运行时异常(Runtime Exception) 

下面的代码展示了 DayOverflow.Spillover 中的选项:

复制代码
//Joda Time 代码
DateTime dt = new DateTime("2010-12-31");
DateTime result = dt.plusMonths(2);
System.out.println(result.toString());
// 输出 2011-02-28(2 月的最后一天)
//Date4j 代码
DateTime dt1 = new DateTime("2010-12-31");
DateTime result1 = dt1.plus(0,2,0,0,0,0,DayOverflow.FirstDay);
System.out.println(result1.toString());
// 输出 2011-03-01(3 月的第一天)
//Date4j 代码
DateTime dt2 = new DateTime("2010-12-31");
DateTime result2 = dt2.plus(0,2,0,0,0,0,DayOverflow.LastDay);
System.out.println(result2.toString());
// 输出 2011-02-28 (2 月 28 日,与 Joda 输出相同)
//Date4j 代码
DateTime dt3= new DateTime("2010-12-31");
DateTime result3 = dt3.plus(0,2,0,0,0,0,DayOverflow.Spillover);
System.out.println(result3.toString());
// 输出 2011-03-02(3 月第二天)

如果应用对精度要求较高并且在处理数据库日期时不想对精度有所损失,或者在处理跨月份日期时想有更灵活的方案供选择,Date4j 会是一个不错的选择。现在,源代码已可直接下载

查看英文原文: Date4j - A Minimalistic Library for Handling Dates

2011-12-04 09:594221
用户头像

发布了 156 篇内容, 共 51.1 次阅读, 收获喜欢 7 次。

关注

评论

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

提高单元测试质量的低代码思路

赫杰辉

Java 后端 低代码 单元测试

一份GitHub star过万的1121页图解算法让“他”成功杀进字节跳动

程序知音

Java 算法 编程语言 后端技术

OceanBase大事记(2023年3月)

OceanBase 数据库

数据库 oceanbase

MobTech MobPush|智能标签推送

MobTech袤博科技

CVPR 2023 大模型研讨会召开在即,国际技术竞赛正式开赛

飞桨PaddlePaddle

KubeVela 1.7 版本解读:接管你的已有工作负载

阿里巴巴云原生

阿里云 开源 云原生 KubeVela

2步搞定拼版!AD通用拼版技巧分享!

华秋PCB

工具 PCB 原理图 PCB设计 拼版

云服务过载控制的前世今生

华为云开发者联盟

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

在Github上标星103K爆火的Spring Security手册及源码笔记,YYDS

程序知音

Java spring security Java进阶 后端技术 java 架构

性能测试难做?RunnerGo带你突破!

爱研究代码的极客人

Jmeter 性能测试 压力测试 测试工具 runnergo

MobTech MobPush|厂商通道支持

MobTech袤博科技

Nautilus Chain 首个生态基础设施 Poseiswap,公布空投规则

西柚子

Python:直观地查看某个物品使用一段时间之后每天的平摊价格

强劲九

Python 面试 matplotlib 算法题

喜报|得帆信息成为中国信通院“卓信大数据计划”成员单位

得帆信息

低代码 中国信通院

拒绝“爆雷”!GaussDB(for MySQL)新上线了这个功能

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 3 月 PK 榜

阿里架构调整完毕,成立云智能集团全面独立经营,张勇兼任CEO

B Impact

2023 微信公开课黄铁鸣企业微信最新动态:1200w、5亿客户、GMV上千亿

B Impact

行业分析| anyRTC智慧视频监控的应用

anyRTC开发者

人工智能 音视频 智慧城市 智慧交通 视频监控

通信云服务全球突围,融云助力互联网产业出海「外卷」

融云 RongCloud

互联网 通信 融云

借AI之势,打破创意与想象的边界

阿里云视频云

阿里云 AIGC

一文详解扩散模型:DDPM

京东科技开发者

人工智能 AIGC 企业号 3 月 PK 榜 DDPM

强大的PDF文档处理:Acrobat Pro DC 2023 中文版

真大的脸盆

Mac PDF Mac 软件 pdf编辑器 PDF文档处理

多工厂、多基地数字化生产管理有难题?得帆云iPaaS可以帮你

得帆信息

集成

AI系统简介和分类

陈磊@Criss

如何构建用户体验优化体系?

嘉为蓝鲸

IT运维 用户体验设计 用户体验分析

一文带你搞懂如何优化慢SQL

京东科技开发者

数据库 sql 优化 企业号 3 月 PK 榜

MobTech MobPush|用户行为分析

MobTech袤博科技

嘉为蓝鲸研发运营一体化解决方案入选金融信创优秀解决方案

嘉为蓝鲸

金融 解决方案 一体化

跨越前后端排障鸿沟,精准排障,让IT人员不“撕逼”

嘉为蓝鲸

告警 后端技术 IT 运维

在 Rainbond 上使用 Curve 云原生存储

北京好雨科技有限公司

云原生 kubernete 分布式存储 rainbond

平台使用体验和大客户推荐指数稳居第一,得帆信息入选《2022中国低代码全景产业研究报告》

得帆信息

低代码平台

Date4j,一个简约的日期处理类库_Java_Kostis Kapelonis_InfoQ精选文章