在Java中比较Date对象的方法

让我们面对现实吧,在Java中对Date对象进行补全既复杂又容易出错。 在标准代码中就是这种情况,而在测试代码中也是如此,在这种情况下,我们经常需要创建指向特定时间点的Date对象,以供我们进行比较。

过时的好方法

在测试代​​码中,我对使用不赞成使用的方法毫不犹豫。 因此,我使用了旧的Date构造函数来初始化日期:

Datedate=newDate(112,5,3);

优点:简洁。 缺点:确实不是很直观,您需要对Java API有所了解,才能知道第一个参数是Year减去1900,第二个参数是month计数(从1月的0开始)。 得知最后一个参数只是...一个月的某天几乎是一个惊喜。

规范的方式

自Java 1.1以来,Java API中引入了Calendar ,以在时间(日期)和特定引用(日历)中的视图之间分离。 以下代码片段是获得与上述结果相同的幼稚方法。

Calendarcalendar=Calendar.getInstance();
calendar.set(YEAR,2012);
calendar.set(MONTH,JUNE);
calendar.set(DAY_OF_MONTH,3);

它不仅更冗长,而且是一个错误:小时,分钟,其余都不为0(取决于日历的确切创建时间),因此在此处使用equals()将返回false 。 这是正确的代码:

Calendarcalendar=Calendar.getInstance();
calendar.set(YEAR,2012);
calendar.set(MONTH,JUNE);
calendar.set(DAY_OF_MONTH,3);
calendar.set(HOUR_OF_DAY,0);
calendar.set(MINUTE,0);
calendar.set(SECOND,0);
calendar.set(MILLISECOND,0);

至少可以说,它破坏了简洁的目的

Apache Commons Lang

自古以来, Apache Commons就提供了不同的实用程序库来帮助用Java开发。 这样的库之一就是Apache Commons Lang ,其目的是提供值得成为Java API一部分的代码。

在我们的例子中, DateUtils类使我们缩短了前面的代码,同时保持了可读性:

Calendarcalendar=Calendar.getInstance();
calendar.set(YEAR,2012);
calendar.set(MONTH,JUNE);
calendar.set(DAY_OF_MONTH,3);
calendar=DateUtils.truncate(calendar,DAY_OF_MONTH);

更好的是, DateUtils让我们直接处理Date对象,也可以进行以下替代:

Datedate=newDate();
date=DateUtils.setYears(date,2012);
date=DateUtils.setMonths(date,JUNE);
date=DateUtils.setDays(date,3);
date=DateUtils.truncate(date,DAY_OF_MONTH);

请注意,它保留了不变的参数,从而增强了功能编程支持者所珍视的不变性。 优点:我们使用标准的Java API。 缺点:没有。 但是,成熟的DSL会不会感觉更合适?

乔达时间

最终的选择是使用Joda Time ,它的目的是替代DateCalendar 。 它还催生了JSR-310 “一种新的和改进的Java日期和时间API”,它应该是Java 8的一部分(最初计划用于Java 7)。 整篇文章(甚至是迷你指南)都可以专门介绍Joda Time。 对于我们当前的关注,以下代码段可以有利地替代我们原来的代码段:

DateMidnightdm=newDateMidnight(2012,6,3);

回到第一个方框,似乎是:简洁明了。 但是,这些参数不言自明,不需要定期检查JavaDocs以了解如何初始化年份。 此外,类名的语义很清楚。 最后,toDate()方法使我们桥接到标准Java API。

结论

结论是你自己的。 至于我自己,我经常使用Apache Commons Lang,但是这些天我倾向于Joda Time。

该代码在这里可以作为Eclipse / Maven项目归档文件获得。

如果您需要处理工作日,最近我们就知道了ObjectLab Kit。 我尚未使用它,欢迎您提供反馈。

翻译自: https://blog.frankel.ch/ways-of-comparing-date-objects-in-java/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值