java创建date对象
让我们面对现实吧,在Java中对Date
对象进行补全既复杂又容易出错。 在标准代码中就是这种情况,而在测试代码中也是如此,我们经常需要创建指向特定时间点的Date
对象,以供我们进行比较。
过时的好方法
在测试代码中,我对使用不赞成使用的方法毫不犹豫。 因此,我使用了旧的Date
构造函数来初始化日期:
Datedate=newDate(112,5,3);
优点:简洁。 缺点:确实不是很直观,您需要掌握Java API的知识才能知道第一个参数是Year减去1900,第二个参数是月数(从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 ,它旨在替代Date
和Calendar
。 它还催生了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/
java创建date对象