Date4j,一个简约的日期处理类库
Java本身的日期类在JDK1.0版本之后就再也没有更新过,同时还存在着一些众所周知的问题(例如1月从0开始,导致了很多月份差一的漏洞)。一份新的Java规范请求(JSR,Java Specification Request)已经被提交,目的就是要解决上述问题,此版本的类库仍处在Alpha版本。在其稳定之前,很多开发者还是会使用Joda Time类库,该类库与JSR-310的参考实现类似。
但虽然乍一看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是一个轻量级的日期处理类库,它的出现为Java开发者提供了一种更为简单易用的方式来处理日期和时间。这个库的目标是简化日期计算,避免使用Java标准库中的`java.util.Date`和`java.util.Calendar`这些复杂的...
从文字转图片可以防止信息被爬取,图片比较相似值则在图像识别和搜索中发挥作用,而日期处理类库则能帮助开发者更好地管理和展示时间数据。理解并熟练掌握这些工具和方法,对于提升IT项目的质量和效率至关重要。
"manba一个Javascript日期处理迷你类库" 指的是Manba,这是一个专门用于JavaScript日期处理的轻量级库。它被设计为小型且高效,与更大型的日期处理库如moment.js相比,Manba的体积更小,更适合对性能和加载速度有较...
Moment.js 是一个简单易用的轻量级JavaScript日期处理类库,提供了日期格式化、日期解析等功能。它支持在浏览器和NodeJS两种环境中运行。此类库能够将给定的任意日期转换成多种不同的格式,具有强大的日期计算功能,...
标题《5个最佳的Javascript日期处理类库分享》告诉我们这篇文章的主旨是介绍五种适用于JavaScript开发者的日期处理库。这些库提供了超出JavaScript原生Date对象功能的工具,用于解析、格式化和处理日期时间数据。 ...
总的来说,滑动日期控件类库是一个强大的工具,它提供了一个便捷的方式来处理日期选择,并允许开发者根据需要进行深度定制。无论是用于创建日期选择功能,还是构建安全的密码输入机制,这个类库都能发挥重要作用。...
"日期流程图显示优化处理类库"则专注于任务流程图的展示和优化,提供了一个基础的源码框架,方便进行二次开发。 首先,我们要理解什么是任务流程图。任务流程图,也被称为活动图或工作流图,是UML(统一建模语言)...
Moment.js 是一个强大的JavaScript日期处理库,专门用于管理和格式化日期和时间。它提供了一种简单易用的方式来处理复杂的日期和时间操作,使得在前端和后端开发中处理日期变得非常方便。 在 Moment.js 中,你可以...
"亚洲文字处理类库"是一个专门针对这类语言设计的工具集,旨在帮助开发者高效地进行文本的读取、解析、编码转换、排版和渲染等操作。下面我们将深入探讨这个主题,详细阐述相关的知识点。 1. **字符编码**:亚洲...
"非常好用的Excel处理类库"提供了一种高效的方式来操作Excel文件,而无需依赖Microsoft Office的组件。这种类库通常包含了丰富的API,可以让我们在编程时轻松地实现对Excel的各种操作。 Aspose.Cells是一个著名的第...
《DotNet多年积累的处理类库源码》 在.NET开发领域,DotNet框架提供了丰富的功能,使得开发者能够高效地构建各种应用程序。本资源集合了作者在公司多年的开发经验,结合了团队中其他技术大牛的智慧,形成了一套实用...
根据给定的信息,本文将详细解释一个用于计算两个公历日期之间相差天数的AS3类库,并深入探讨其实现细节和技术要点。 ### AS3指定的两个公历日期相差天数类库 #### 一、简介 在ActionScript 3(AS3)中,有时我们...
"一个PHP安全过滤类库"是专门为开发者设计的工具,旨在帮助他们在处理用户输入数据时防止各种安全威胁。这类库通常包含一系列预定义的函数或类方法,用于对输入数据进行验证、清理和转义,以消除潜在的SQL注入、跨站...
在C++中,Boost库是一个广泛使用的非官方类库,它包含了许多高质量的工具,如智能指针、线程管理、正则表达式、测试框架等。Boost库的一些组件甚至被采纳为C++标准库的一部分。 MFC(Microsoft Foundation Classes...
标题“几个简单类库”可能指的是一个集合,包含了一些用于简化编程任务的Java类库。这些类库可能包含了处理XML解析、RSS数据处理以及SQLite数据库操作等功能。让我们逐一深入探讨这些知识点。 首先,我们看到一个名...
"E4A清明类库(合集)"是一个专门针对E4A平台设计的类库集合,旨在为开发者提供一系列实用的功能模块,以提高开发效率和代码质量。 这个类库合集可能包含了多个不同功能的子库,例如: 1. UI组件:可能包括各种...
"ok类库合集.rar" 是一个集合了多个实用类库的压缩文件,主要针对的是IT开发中的前端或UI设计部分。这些类库都以".elb"为扩展名,可能是一种特定的库或组件格式,例如在某些前端框架或者开发环境中使用。每个类库都...
这些是动软公共类库的核心组成部分,它们能够为开发者提供一个强大而全面的工具箱,让开发工作更加高效、稳定。通过深入理解和运用这些类库,开发者可以更好地利用动软的优势,加速项目的开发进度,同时保证代码质量...
总的来说,这个"C#多年累积类库"是.NET开发者的一个宝贵资源,它凝聚了作者的经验和智慧,可以帮助其他开发者快速实现功能,减少重复工作,提升开发速度和代码质量。在使用时,应当根据具体需求选择合适的类和方法,...