10 月,开发者不可错过的开源大数据大会-2021 WeDataSphere 社区大会深圳站 了解详情
写点什么

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

2011 年 12 月 04 日

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

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

关注

评论

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

Spring 源码学习 16:单例 Bean 创建

程序员小航

Java spring 源码

中金数据集团与腾讯云合力拓展信息安全、区块链业务领域

CECBC区块链专委会

区块链产业

1121212

熙羽1

【Http】- Http之状态码

双木之林

网络 HTTP

即将爆火的Java突击手册,全面详细对标P7岗,github已标星81.6k

Crud的程序员

Java 架构

Spring Boot 中集成Redis

武哥聊编程

Java redis springboot SpringBoot 2 28天写作

Redis 学习笔记 09:数据库

架构精进之路

redis 七日更 28天写作

数字货币交易所APP开发|数字货币交易所软件系统开发

系统开发

亲历者说 | 完整记录一年多考拉海购的云原生之路

阿里巴巴云原生

阿里云 容器 微服务 云原生 dubbo

Nginx实现在局域网内真正的ip_hash负载均衡​

会飞的猪

场外OTC交易系统开发|场外OTC交易软件APP开发

系统开发

华为云登顶HotpotQA多跳知识推理问答评测

华为云开发者社区

深度学习 华为 华为云

不是吧?阿里“百万级”性能优化小册居然能让系统运行得这么快

程序员小毕

Java MySQL 架构 性能优化 JVM

HTML(五)——建立表格

程序员的时光

程序员 前端 七日更 28天写作

认识产品经理(第一章上)

让我思考一会儿

虚言妙诀终虚见,面试躬行是致知,Python技术面试策略与技巧实战记录

刘悦的技术博客

Python 面试

Git神作!2021年Java春招高级面试指南,吃透至少P7

比伯

Java 编程 架构 面试 计算机

MySQL锁机制

程序员小毕

MySQL sql 线程 优化

python+requests接口测试基础

测试人生路

软件测试

区块链高水平专业人才稀缺成发展掣肘

CECBC区块链专委会

区块链人才

数字人民币带来更好支付体验 没有网络时也能使用

CECBC区块链专委会

数字人民币

Soul网关源码阅读(十)自定义简单插件编写

Java 源码阅读 网关

DBA 的效率加速器——CloudQuery v1.3.2 上线!

CloudQuery社区

数据库 运维 开发日志 dba 数据库管理工具

Seata RPC 模块的重构之路

阿里巴巴云原生

阿里云 开源 云原生 RPC seata

《认识产品经理》课后总结

DB

产品经理训练营

双仓合约量化交易系统开发搭建

薇電13242772558

区块链 数字货币

阿里用5大核心技术+10大高级框架+200个经典案例全面解答了并发网络编程

996小迁

编程 架构 面试 笔记 亿级流量

干货|更通用的P2P网络协议栈——Libp2p

QTech

IPFS Libp2p

TARS 染色日志|收集记录特定日志

TARS基金会

微服务 运维 日志 日志分析 TARS

我凭借这份pdf,最终拿到了阿里,腾讯,京东等八家大厂offer

Crud的程序员

Java 程序员 架构

区块链交易所软件开发|区块链交易所APP系统开发

系统开发

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