失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 看山聊Java:Date 与 LocalDate 或 LocalDateTime 互相转换

看山聊Java:Date 与 LocalDate 或 LocalDateTime 互相转换

时间:2023-04-23 03:30:02

相关推荐

看山聊Java:Date 与 LocalDate 或 LocalDateTime 互相转换

你好,我是看山。

从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时间 API 之间切换,并行使用。今天就来说说,java.util.Datejava.time.LocalDate/LocalDateTime如何互相转换。

java.util.Date转为java.time.LocalDate

Java8 发行的时候,也考虑到了新旧 API 之间的转换,所以在java.util.Date中增加了toInstance()方法,可以得到一个Instance实例。Instance没有时区概念,所以我们需要通过atZone()指定时区,得到ZonedDateTime实例,然后转换为java.time.LocalDate。如下:

public LocalDate convertToLocalDateViaInstant(Date dateToConvert) {return dateToConvert.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();}

同样的,我们也可以借助InstanceofEpochMilli()方法创建实例。如下:

public LocalDate convertToLocalDateViaMilisecond(Date dateToConvert) {return Instant.ofEpochMilli(dateToConvert.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();}

Java 中,除了java.util.Date,还有一个 Date 对象是java.sql.Date,java8 给这个类增加了一个直接转换为LocalDate的方法toLocalDate()。所以,我们也可以将java.util.Date转换为java.sql.Date,然后借助toLocalDate()方法。如下:

public LocalDate convertToLocalDateViaSqlDate(Date dateToConvert) {return new java.sql.Date(dateToConvert.getTime()).toLocalDate();}

java.util.Date转为java.time.LocalDateTime

java.util.Date是包含年月日时分秒的,转为java.time.LocalDate是把时分秒去掉,转为java.time.LocalDateTime是精度保留,转换方式完全一样,只不过要用到的是toLocalDateTime()方法。如下:

public LocalDateTime convertToLocalDateTimeViaInstant(Date dateToConvert) {return dateToConvert.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();}public LocalDateTime convertToLocalDateTimeViaMilisecond(Date dateToConvert) {return Instant.ofEpochMilli(dateToConvert.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();}

java.sql.Date精度只有年月日,java.sql.Timestamp精度包含时分秒,所以还可以借助这个类的toLocalDateTime()方法实现转换:

LocalDateTime convertToLocalDateTimeViaSqlTimestamp(Date dateToConvert) {return new java.sql.Timestamp(dateToConvert.getTime()).toLocalDateTime();}

接下来,我们看看怎么从新时间 API 转旧时间 API。

java.time.LocalDate转为java.util.Date

先来一个简单的方法,借助java.sql.DatevalueOf()方法,如下:

public java.util.Date convertToDateViaSqlDate(LocalDate dateToConvert) {return java.sql.Date.valueOf(dateToConvert);}

java.sql.Date.valueOf()方法的实现也比较简单,我们也可以自己实现:

public static Date valueOf(LocalDate date) {return new Date(date.getYear() - 1900,date.getMonthValue() - 1,date.getDayOfMonth());}

题外话:不知为何 Java8 这么偏爱java.sql.Date,提供了各种好用的转换方法。但是按照我的习惯,大部分时间用的都是java.util.Date类,是不是这个习惯得改改了。

还有一种方式,是借助java.util.Datefrom(Instant instant)方法,如下:

public java.util.Date convertToDateViaInstant(LocalDate dateToConvert) {return java.util.Date.from(dateToConvert.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());}

java.time.LocalDateTime转为java.util.Date

介绍两种方式。

一种是借助java.sql.TimestampvalueOf()方法,如下:

public java.util.Date convertToDateViaSqlTimestamp(LocalDateTime dateToConvert) {return java.sql.Timestamp.valueOf(dateToConvert);}

另一种方式是:

public java.util.Date convertToDateViaInstant(LocalDateTime dateToConvert) {return java.util.Date.from(dateToConvert.atZone(ZoneId.systemDefault()).toInstant());}

文末总结

虽然 Java8 已经是行业底线,但是为了向下兼容,很多类库或者遗留代码依然保留了旧 API,不可能一夜之间替换完毕,所以我们还是会有新旧 API 的转换。本文提供几种转换方式,可供大家使用。当然,条条大路通罗马,这些方法都不是唯一的方式。

参考

core-java-8-datetime

推荐阅读

Java8 的时间库(1):介绍 Java8 中的时间类及常用 APIJava8 的时间库(2):Date 与 LocalDate 或 LocalDateTime 互相转换

你好,我是看山,公众号:看山的小屋,10 年老猿,开源贡献者。游于码界,戏享人生。

个人主页:

个人博文:Java8 的时间库(2):Date 与 LocalDate 或 LocalDateTime 互相转换

CSDN 主页:/liuxinghao

CSDN 博文:Java8 的时间库(2):Date 与 LocalDate 或 LocalDateTime 互相转换

如果觉得《看山聊Java:Date 与 LocalDate 或 LocalDateTime 互相转换》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。