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

简介: 从 Java1 到 Java8 将近 20 年,再加上 Java8 的普及时间、各种历史 API 兼容过渡时间。我们很多时候需要在旧时间 API 与新时间 API 之间切换,并行使用。

image.png

你好,我是看山。


从 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。如下:


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

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


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.Date的valueOf()方法,如下:


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.Date的from(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.Timestamp的valueOf()方法,如下:


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 中的时间类及常用 API

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

目录
相关文章
|
2月前
|
存储 Java 程序员
【Java】(6)全方面带你了解Java里的日期与时间内容,介绍 Calendar、GregorianCalendar、Date类
java.util 包提供了 Date 类来封装当前的日期和时间。Date 类提供两个构造函数来实例化 Date 对象。第一个构造函数使用当前日期和时间来初始化对象。Date( )第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
196 1
|
4月前
|
安全 Java API
Java日期时间API:从Date到Java.time
本文深入解析了Java 8中引入的全新日期时间API,涵盖LocalDate、LocalTime、LocalDateTime、ZonedDateTime等核心类的使用,以及时间调整、格式化、时区处理和与旧API的互操作。通过实例对比,展示了新API在可变性、线程安全与易用性方面的显著优势,并提供迁移方案与实战技巧,助你掌握现代Java时间处理的最佳实践。
|
4月前
|
存储 Java
Java LocalDateTime与hutool DateUtil实现秒转换为时分秒格式化展示。
注意:以上代码示例仅适合于处理小于24小时内(86400s) 总积 因 LocalDateTime 和 Local Time 不支持超过24小时表达而 huo tool示例虽然理论上支持但未考虑超过24小时情况下可能出现负值等异常情况处理细节需用户自行添加相关逻辑以确保正确性.
330 7
|
Java
Java的Date类使用
Java的Date类使用
147 0
|
安全 Java API
时间日期API(Date,SimpleDateFormat,Calendar)+java8新增日期API (LocalTime,LocalDate,LocalDateTime)
这篇文章介绍了Java中处理日期和时间的API,包括旧的日期API(Date、SimpleDateFormat、Calendar)和Java 8引入的新日期API(LocalTime、LocalDate、LocalDateTime)。文章详细解释了这些类/接口的方法和用途,并通过代码示例展示了如何使用它们。此外,还讨论了新旧API的区别,新API的不可变性和线程安全性,以及它们提供的操作日期时间的灵活性和简洁性。
|
Java
Java实现:将带时区的时间字符串转换为LocalDateTime对象
通过上述方法,你可以将带时区的时间字符串准确地转换为 `LocalDateTime`对象,这对于处理不需要时区信息的日期和时间场景非常有用。
1819 4
|
Java API
java date 增加10s后的时间
在 Java 中,要将 `Date` 对象增加 10 秒,可以通过 `Calendar` 类(适用于 Java 8 之前)或 `java.time` 包中的 `LocalDateTime`、`ZonedDateTime` 和 `Instant` 类(Java 8 及以上)实现。使用 `Calendar` 类时,需设置并修改 `Calendar` 实例。而在 `java.time` 包中,可以使用 `plus` 方法结合 `ChronoUnit.SECONDS` 来增加秒数。具体选择取决于是否需要处理时区以及 Java 版本。
406 1
|
Java Linux Python
CheerpJ转换JAVA使用最简教程
CheerpJ转换JAVA使用最简教程
520 0
CheerpJ转换JAVA使用最简教程
|
2月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
193 1
|
2月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
215 1