clob超过4000如何转字符串_教你如何优雅地用Java8 实现日期时间的操作

作者 | Java圣斗士 | 原创文章,转载请注明出处

全文4000字,阅读大约需要15分钟,建议收藏

15fcd49b0d3876429f0efd16c3cd3b91.png

小花:Hey,Morty。最近正在准备面试,你说Java8 的新特性会不会考到呢?

我:Java8 14年3月份就出了,到现在已经有很长的一段发展时间了。但是根据我的面试经验,在笔试题的部分应该不会直接让你写出Java8 的解决方案,倒是会在面试的过程中由技术官提问一些比较重要的Java 8 特性

小花:哦,那Java 8 有什么在开发中经常会用到的特性呢?

我:有很多啊,其中一个就是为了解决广遭诟病的Java日期操作而推出的“时间日期API”。

小花:哦?Java8 原来还有这么个好东西?以前处理日期和时间的时候,总是感觉很别扭。

我:是的呢。在Java8 以前,我们处理时间或者格式化都是通过 java.util.Date 和java.text.DateFormat。这在操作的时候有诸多的不便,在实际生产开发中很容易受到限制。

首先,Date类本身是可变类型,而SimpleDateFormat也不是线程安全的。这一点在并发编程的时候就不得不认真考虑。而在Java8中,不仅改善了日期类型的线程安全性,将java.time包下所有的 API 如LocalDateTimeDateTimeFormatter都设置为了final的,而且也添加了更加丰富的日期处理功能,比如比较两个时间大小;计算一天后、一天前,或者一周后、一周前的日期等等。甚至判断闰年也都是现成的接口

小花:天哪,用了这么久java8,居然都不知道还有这么神奇的玩意。前阵子和其他公司对接接口,日期这部分着实费了不少力气,早知道Java8的日期API这么强大,我就不用掉这么多头发了,呜呜呜~~~

2931255bd3cf53eab19f80660fac0247.png

:恩,是的呢。

小花:那我们在日期与字符串相互转化的时候,应该怎样用Java8 来描述呢?

:恩,日期和字符串的相互转化的确是常见的场景。不过先不着急,来看看在Java8中如何获取当前时间吧:

LocalDateTime now = LocalDateTime.now();//output : 2019-06-06T14:16:05.323

小花:咦?感觉代码可读性更强了一些,不过输出的时候为什么中间会带一个大T呢?而且也不用 format 直接就显示成了爱情的模样!

我:哈哈,你还真皮。大T是因为LocalDateTime 的toString方法遵循ISO-8601的国际标准,你可以上网百度一下这个标准,简单的说就是在日期和时间组合显示的时候,中间要加个'T',具体原因我也没有联系过相关负责人,不过根据我的经验,很可能是因为空格的话在信息传输的过程中,由于不可见字符造成一些编码的错误,这在Base64编码中有过相关的描述

另外,不仅LocalDateTime重写了toString,其他的比如DateTime都完成了最常用的文本描述形式。因为在大多数情况,人们只需要yyyy-MM-dd HH:mm:ss的形式而不需要像:Tue Jun 04 07:20:19 CST 2019,这样。

小花:就是嘛,new Date()之后每次都要format,真的没必要。

我:Java8 中也提供了日期的字符串格式化,而且都是静态方法,相比java.util,这套API可真是做到了完全的工具化处理。

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");String nowStr = now.format(formatter);// output : 2019-06-06 14:37:32

你可以像上面这样直接来格式化日期类型的对象,但是要注意,LocalDate只包含日期,LocalTime只包含时间,如果你的 pattern 串中无法与之匹配,就会报:UnsupportedTemporalTypeException异常。举个栗子:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd");LocalTime now = LocalTime.now(); // 只获取时间的封装System.out.println(formatter.format(now)); //异常

小花:还真是把双刃剑!

c770463204b472e2cd199ad24b446695.png

我:嗯嗯,java8日期API将日期时间日期加时间进行了细分,操作更灵活,但同时也需要小心处理。其实如果你用惯了java.util.Date,你只需要直接使用LocalDateTime就可以了,形式上它和Date本身都是日期加时间的组合版,而且,如果你看到LocalDateTime的源码的话,一定很吃惊,因为它完全就是调用的LocalDate和LocalTime的接口,换句话说,它只是把这两个类型有机组合之后的封装API

接下来,我们我们来聊聊比较有意思的场景吧。

小花:嗯,我想表示具体某一天的日期,应该如何获取到日期对象呢?

我:如果你心里有一个具体的日期,或者时间,可以直接这样写:

LocalDateTime nationalDay = LocalDateTime.of(2019, Month.OCTOBER, 1, 0, 0);// output : 2019-10-01T00:00

如果只需要日期就可以把LocalDateTime 换成LocalDate,并去掉参数中的时和分。如果只是一个日期字符串,可以利用DateTimeFormatter:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime someDay = LocalDateTime.parse("2019-10-01 14:30:30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值