【AICon】探索RAG 技术在实际应用中遇到的挑战及应对策略!AICon精华内容已上线73%>>> 了解详情
写点什么

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

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

关注

评论

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

linux比较两个目录的差异

入门小站

Linux

没有一个人喜欢被改变 ——阅读《高绩效教练》有感

研发管理Jojo

倾听 敏捷教练 引导和教练

微博评论架构分析

🌾🌾🌾小麦🌾🌾🌾

架构实战营

在线文本差集计算工具

入门小站

工具

如何设计业务高性能高可用计算架构

天天向上

架构实战营

[Pulsar] Batch Messge的基本原理

Zike Yang

Apache Pulsar 11月日更

阿里云 Serverless 助力企业全面拥抱云原生

阿里巴巴云原生

阿里云 Serverless 云原生 企业

选手机的一点建议

印哥爱学习

手机 生活随想

phpstudy开启Apache服务显示80端口被占用

咿呀呀

PHPStudy

架构训练营 - 模块 5 作业

焦龙

架构训练营

应对 Job 场景,Serverless 如何帮助企业便捷上云

阿里巴巴云原生

阿里云 Serverless 云原生 函数 Job

云原生体系下 Serverless 弹性探索与实践

阿里巴巴云原生

阿里云 Serverless 云原生 弹性 SAE

架构实战营模块五作业

孙志强

架构实战营

阿里云徐立:面向容器和 Serverless Computing 的存储创新

阿里巴巴云原生

阿里云 Serverless 容器 云原生

DevOps反模式

俞凡

DevOps

《重学Java高并发》Sempahore的使用场景与常见误区

中间件兴趣圈

Java高并发 Sempahore

技术管理知识写作系列

Melody

写作计划

28 K8S之控制器基础

穿过生命散发芬芳

k8s 11月日更

为什么SOLID原则仍然是现代软件架构的基石

topsion

CleanCode SOLID

1 分钟 Serverless 极速抽盲盒,自己部署自己抽!

阿里巴巴云原生

阿里云 Serverless 云原生

元宇宙对网络技术的挑战,什么样的网络才能承载元宇宙的野心?

CECBC

瞰见 | 刚刚,暴涨的 GitLab 给我们带来了怎样的开源思考?

OpenTEKr

狄安瞰源

记录

Melody

Flink 实践教程-入门(8): 简单 ETL 作业

腾讯云大数据

flink 流计算 Oceanus

哈佛商业评论:面向未来的组织

石云升

读书笔记 11月日更

领导力学习课-总结

印哥爱学习

个人成长 管理

【架构实战营】模块五作业

liu🍊

KubeMeet 深圳站回顾:应对云原生边缘计算落地挑战

阿里巴巴云原生

阿里云 Kubernetes 云原生 线下活动

如何利用 “集群流控” 保障微服务的稳定性?

阿里巴巴云原生

阿里云 高可用 云原生 集群 AHAS

微博评论架构设计

天天向上

架构实战营

入驻快讯|欢迎AfterShip正式入驻 InfoQ 写作平台!

InfoQ写作社区官方

入驻快讯

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