尽管Java8时间库有所进步,但总感觉Low了点,有同感吗?

你知道的越多,不知道的就越多,业余的像一棵小草!

你来,我们一起精进!你不来,我和你的竞争对手一起精进!

编辑:业余草

toutiao.com/i6886042266360775181

推荐:https://www.xttblog.com/?p=5133

最近有网友表示,在自己公司和项目中,实际上时间库应用不算太多,用到也是非常简单的一些应用场景,一般情况下连Java8的时间库都很少用到,今天为了写个时间查询,把他折腾的够呛,是他没有领悟到Java8时间库的精髓吗?还是他的功力不够?也还是,Java8的时间库真的太 Low ?一起来看看吧

需求:给定一个时间范围:Date from, Date to,查询出在这时间范围内的记录并按日期(年月日)分组,每条记录的日期是包含日期和时间的,需要进行Truncate。如果只输入一个日期,那么只统计该天的所有记录,即0时0分0秒到23时59分59秒之间的记录。

问题1:Java8中的LocalDate与Date互转

Date和LocalDate互转代码

这个互转的写法应该是比较正统的吧,老铁们应该没有什么异议。我就想说都是一家的,这转换咋就这么麻烦呢?正常不是应该这样吗:

LocalDate ld;
Date date = ld.toDate();

或者:

Date date;
LocalDate ld = LocalDate(date);
LocalDate ld = LocalDate.from(date);

看看人家Joda-time:

// from Joda to JDK
DateTime dt = new DateTime();
Date jdkDate = dt.toDate();

// from JDK to Joda
dt = new DateTime(jdkDate);
// from Joda to JDK
DateTime dt = new DateTime();
Calendar jdkCal = dt.toCalendar(Locale.CHINESE);
// from JDK to Joda
dt = new DateTime(jdkCal);

Java不愧为“渣瓦”,哎,不过兴许还真是咱太菜吧,没法领悟 Java 大佬的设计精髓。虽然,数据库可以直接转 Localdate。Mybatis 也支持 Localdate 和 Localdatetime。但是 Java 内部的 Date 和 Localdate 相互之前转换起来真的不够“温柔”。

问题2:Calendar和Java8就是完全两张皮

实现一个功能:给定一个Date,只截取年、月、日,并将其分解为两个Date,一个是XXXX年XX月XX日 00:00:00和XXXX年XX月XX日 23:59:59

用Calendar实现的代码

直接把某开源项目中的代码片段截了个图,各位看官是不是觉得非常累赘,可不是嘛,用Java8的时间库也简洁不到哪里去,写法如下:

Java8时间库的写法

堂堂 Java8 的时间库,连基本的截取(truncate)操作都木有,哎,说你什么好呢,“渣瓦”!

我们再看看Joda的“骚”操作:

Joda时间库的写法

简洁的不得了哦

问题3:Date还不能直接转LocalDate,这还有天理吗?

private LocalDate dateToLocalDate(Date date) {
    Instant instant = date.toInstant();
    return LocalDate.from(instant);
}

居然报异常了

所以,Java8 时间库虽然进步很大,但在可用性上还真差点意思,Java 程序员已经比较苦逼啦,能不能体量体量撒。

都说 Java 太过“啰嗦”,API 不够简洁。业余草建议直接用 Long,但是 Long 也有一些小问题的,比如闰秒问题。所以,还是看个人选择!

说归说,吐槽归吐槽。Localdate 和 Localdatetime 的优先级还是要比 Date 高。毕竟,Java8 已经不推荐使用 Date 了。

业余草 CSDN认证博客专家 Java Go/GoLang Redis
如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件。而上帝在努力创造出更大更傻的傻瓜。目前为止,上帝是赢的。个人网站:www.xttblog.com。个人微信:codedq或dart996
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页