【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

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

关注

评论

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

聚集索引数据写入

lixiaofeng

索引优化 签约计划第二季

趣谈 iOS Universal Link

37手游iOS技术运营团队

ios universal link

golang 脚本实时监控错误日志

lixiaofeng

mongodb MySQL 运维 签约计划第二季

Spring AOP(三) Advisor类架构

程序员历小冰

28天写作 spring aop 12月日更

学习 27 门编程语言的长处,提升你的 Python 代码水平

Python猫

Python

C#中的结构与类

喵叔

28天写作 12月日更

数据大体系(四)——标签

圣迪

大数据 标签 标签体系 数据体系

用 Go + Redis 实现分布式锁

万俊峰Kevin

微服务 高并发 分布式锁 go-zero Go 语言

漏洞学习篇:CVE漏洞复现

网络安全学海

黑客 网络安全 信息安全 渗透测试 漏洞修复

MySQL MGR + 自研脚本实现高可用

lixiaofeng

MySQL 高可用 签约计划第二季

MongoDB自动化运维

lixiaofeng

mongodb 签约计划第二季

前端架构师破局技能,Node.js 落地 WebSocket 实践

杨成功

架构 前端 架构师 nodejs websocket 签约计划第二季

Go+ 上下文处理教程(5.3)

liuzhen007

28天写作 12月日更

关于分布式事务的思考

yuexin_tech

SQL SERVER的统计信息

lixiaofeng

SQL优化 签约计划第二季

Spring Native 0.11发布,带来新的AOT引擎和性能优化

Robert Lu

Java GraalVM

Feign入门篇

李子捌

微服务 28天写作 12月日更

MySQL Xenon源码阅读-01

lixiaofeng

MySQL MySQL 高可用 签约计划第二季

“元宇宙”,让人在数据空间“复活”

xcbeyond

28天写作 云宇宙 12月日更

NCF框架如何实现WebApi(四)

MartyZane

实战 签约计划第二季 NCF DDD框架 WebApi

MSSQL 执行计划

lixiaofeng

SQL优化 签约计划第二季

你真的了解inner join吗

lixiaofeng

签约计划第二季

端口是什么东西?为什么老是被黑客利用

喀拉峻

黑客 网络安全 安全

从WAVE SUMMIT+2021,寻找新一代AI人不可或缺的“凝视”

脑极体

MySQL MGR + 只读节点高可用

lixiaofeng

MySQL 高可用 签约计划第二季

读《思辨与立场》-01定义

wood

28天写作 批判性思维 思辨与立场

LeetCode刷题开源手册

入门小站

Leet Code

Python Qt GUI设计:QMdiArea和QMdiSubWindow类实现多文档界面(拓展篇—3)

不脱发的程序猿

Python qt GUI设计 Qt Company 多文档界面

MSSQL索引优化原理

lixiaofeng

SQL优化 签约计划第二季

每个前端都值得拥有自己的组件库,就像每个冬天都拥有春秋裤⛄️

速冻鱼

前端 组件库 签约计划第二季 12月日更

谈跨域资源共享之CORS

devpoint

jsonp CORS 12月日更

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