Java8中 Date和LocalDate的相互转换

本文介绍如何在Java中将Date对象转换为LocalDate对象以及反向转换的方法。通过具体示例展示了利用ZonedDateTime作为中间桥梁实现两种日期类型之间的转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.简述

Date对象表示特定的日期和时间,而LocalDate(Java8)对象只包含没有任何时间信息的日期。
因此,如果我们只关心日期而不是时间信息,则可以在Date和LocalDate之间进行转换。

二.Date转LocalDate

如果要将java.util.Date转换为java.time.LocalDate,可以使用以下步骤:

1)将java.util.Date转换为ZonedDateTime。
2)使用它的toLocalDate()方法从ZonedDateTime获取LocalDate。

示例:

package insping;

import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

public class Test {

    public static void main(String[] args) {
        Date date = new Date();
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();

        // atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        System.out.println("Date = " + date);
        System.out.println("LocalDate = " + localDate);
    }
}

结果:

Date = Fri Jun 16 15:29:05 CST 2017
LocalDate = 2017-06-16

三.LocalDate转Date

现在,如果要将LocalDate转换回java.util.Date,可以使用以下步骤:

1)使用ZonedDateTime将LocalDate转换为Instant。
2)使用from()方法从Instant对象获取Date的实例

示例:

package insping;

import java.time.LocalDate;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

public class Test {

    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDate localDate = LocalDate.now();
        ZonedDateTime zdt = localDate.atStartOfDay(zoneId);

        Date date = Date.from(zdt.toInstant());

        System.out.println("LocalDate = " + localDate);
        System.out.println("Date = " + date);

    }
}

结果:

LocalDate = 2017-06-16
Date = Fri Jun 16 00:00:00 CST 2017
Java中,`Date``LocalDate`是两个不同的日期时间处理类。`Date`是旧版Java中的日期时间表示,而`LocalDate`则是Java 8引入的,属于`java.time`包下的现代日期模型。 **Date**类代表的是从1970年1月1日(UTC/GMT的午夜)开始的毫秒数,不包含时区信息,它容易受到系统时钟影响,不推荐在新项目中使用。 **LocalDate**类则是一个纯粹的日期部分,没有时间或时区,它是基于历法的,提供了很多现代日期操作,如计算年、月、日等。 要将`Date`转换为`LocalDate`,你需要一个`ZonedDateTime`作为桥梁,因为`Date`不包含时区信息。这里是一个示例: ```java import java.time.LocalDate; import java.time.ZonedDateTime; import java.util.Date; public LocalDate convertToDate(LocalDate date) { // 假设你的系统时区 ZoneId zone = ZoneId.systemDefault(); ZonedDateTime zonedDateTime = ZonedDateTime.of(date, zone); return zonedDateTime.toLocalDate(); // 将ZonedDateTime转换LocalDate } // 如果你有一个Date对象 Date dateObj = ...; LocalDate localDate = convertToDate(dateObj.toInstant().atZone(zone).toLocalDate()); ``` 反过来,将`LocalDate`转换为`Date`通常不需要,但如果你坚持,可以通过`Instant``Date`构造函数: ```java Date toDate(LocalDate date) { Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant(); return Date.from(instant); // 注意,Date已被弃用,仅用于兼容旧代码 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值