Java8 的时间库(2):Date 与 LocalDate 或 LocalDateTime 互相转换
你好,我是看山。
从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时间 API 之间切换,并行使用。今天就来说说,java.util.Date
与java.time.LocalDate/LocalDateTime
如何互相转换。
java.util.Date
转为java.time.LocalDate
Java8 发行的时候,也考虑到了新旧 API 之间的转换,所以在java.util.Date
中增加了toInstance()
方法,可以得到一个Instance
实例。Instance
没有时区概念,所以我们需要通过atZone()
指定时区,得到ZonedDateTime
实例,然后转换为java.time.LocalDate
。如下:
同样的,我们也可以借助Instance
的ofEpochMilli()
方法创建实例。如下:
Java 中,除了java.util.Date
,还有一个 Date 对象是java.sql.Date
,java8 给这个类增加了一个直接转换为LocalDate
的方法toLocalDate()
。所以,我们也可以将java.util.Date
转换为java.sql.Date
,然后借助toLocalDate()
方法。如下:
java.util.Date
转为java.time.LocalDateTime
java.util.Date
是包含年月日时分秒的,转为java.time.LocalDate
是把时分秒去掉,转为java.time.LocalDateTime
是精度保留,转换方式完全一样,只不过要用到的是toLocalDateTime()
方法。如下:
java.sql.Date
精度只有年月日,java.sql.Timestamp
精度包含时分秒,所以还可以借助这个类的toLocalDateTime()
方法实现转换:
接下来,我们看看怎么从新时间 API 转旧时间 API。
java.time.LocalDate
转为java.util.Date
先来一个简单的方法,借助java.sql.Date
的valueOf()
方法,如下:
java.sql.Date.valueOf()
方法的实现也比较简单,我们也可以自己实现:
题外话:不知为何 Java8 这么偏爱
java.sql.Date
,提供了各种好用的转换方法。但是按照我的习惯,大部分时间用的都是java.util.Date
类,是不是这个习惯得改改了。
还有一种方式,是借助java.util.Date
的from(Instant instant)
方法,如下:
java.time.LocalDateTime
转为java.util.Date
介绍两种方式。
一种是借助java.sql.Timestamp
的valueOf()
方法,如下:
另一种方式是:
文末总结
虽然 Java8 已经是行业底线,但是为了向下兼容,很多类库或者遗留代码依然保留了旧 API,不可能一夜之间替换完毕,所以我们还是会有新旧 API 的转换。本文提供几种转换方式,可供大家使用。当然,条条大路通罗马,这些方法都不是唯一的方式。
推荐阅读
你好,我是看山,公众号:看山的小屋,10 年老猿,开源贡献者。游于码界,戏享人生。
版权声明: 本文为 InfoQ 作者【看山】的原创文章。
原文链接:【http://xie.infoq.cn/article/9e33585b7a4fb3f3f6c0a8d26】。文章转载请联系作者。
评论