Date、LocalDate、LocalTime、LocalDateTime、String以及时间戳的相互转换

关注我,升职加薪就是你!
好长时间没搞博客了,今天我们来搞搞Date、LocalDate、LocalTime、LocalDateTime、String以及时间戳的相互转换。话不多说,直接上代码。

package com.lovemax.test.common.utils;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @Author: Max
 * @Date: 2022/12/6
 * @Description: 日期工具类
 * @Version: v1.0
 */
public class DateUtil {

    /**
     * @Author: Max
     * @Date: 2022/11/23
     * @Description: 往前推几分钟
     * @Param:
     * @param date
     * @param minutes 若 minutes=5,则为往前推5分钟
     * @Return: java.util.Date
     */
    public static Date minusMinutes(Date date, long minutes) {
        LocalTime localTime = dateToLocalTime(date).minusMinutes(minutes);
        LocalDate localDate = dateToLocalDate(date);
        return localDateAndTimeToDate(localDate, localTime);
    }

    /**
     * @Author: Max
     * @Date: 2022/11/23
     * @Description: LocalTime转Date
     * @Param:
     * @param localTime
     * @Return: java.util.Date
     */
    public static Date localDateAndTimeToDate(LocalDate localDate, LocalTime localTime) {
        return Date.from(LocalDateTime.of(localDate, localTime).atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * @Author: Max
     * @Date: 2022/11/23
     * @Description: Date转LocalTime
     * @Param:
     * @param date
     * @Return: java.time.LocalTime
     */
    public static LocalTime dateToLocalTime(Date date) {
        LocalDateTime localDateTime = dateToLocalDateTime(date);
        return localDateTime.toLocalTime();
    }

    /**
     * @Author: Max
     * @Date: 2022/11/23
     * @Description: Date 转 LocalDateTime
     * @Param:
     * @param date
     * @Return: java.time.LocalDateTime
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    /**
     * @Author: Max
     * @Date: 2022/11/28
     * @Description: Date 转 String
     * @Param:
     * @param date 日期
     * @param pattern 返回日期的字符串格式 如“yyyy-MM-dd”
     * @Return: java.lang.String
     */
    public static String dateToString(Date date, String pattern) {
        LocalDate localDate = dateToLocalDate(date);
        return localDate.format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * @Author: Max
     * @Date: 2022/11/28
     * @Description: Date 转 LocalDate
     * @Param:
     * @param date
     * @Return: java.time.LocalDate
     */
    public static LocalDate dateToLocalDate(Date date) {
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * @Author: Max
     * @Date: 2022/11/28
     * @Description: String 转 LocalDate
     * @Param:
     * @param string
     * @param pattern 返回日期的字符串格式 如“yyyy-MM-dd”
     * @Return: java.lang.String
     */
    public static LocalDate stringToLocalDate(String string, String pattern) {
        return LocalDate.parse(string, DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * @Author: Max
     * @Date: 2022/11/28
     * @Description: String 转 Date
     * @Param:
     * @param string
     * @param pattern
     * @Return: java.util.Date
     */
    public static Date stringToDate(String string, String pattern) {
        LocalDate localDate = stringToLocalDate(string, pattern);
        return localDateToDate(localDate);
    }

    /**
     * @Author: Max
     * @Date: 2022/11/28
     * @Description: localDate转Date
     * @Param:
     * @param localDate
     * @Return: java.util.Date
     */
    public static Date localDateToDate(LocalDate localDate) {
        Instant instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant();
        return Date.from(instant);
    }

    /**
     * @Author: Max
     * @Date: 2022/11/29
     * @Description: 时间戳转LocalDate
     * @Param:
     * @param time
     * @Return: java.time.LocalDate
     */
    public static LocalDate longToLocalDate(long time) {
        return Instant.ofEpochMilli(time).atZone(ZoneOffset.ofHours(8)).toLocalDate();
    }

    /**
     * @Author: Max
     * @Date: 2022/11/29
     * @Description: 时间戳转LocalDateTime
     * @Param:
     * @param time
     * @Return: java.time.LocalDateTime
     */
    public static LocalDateTime longToLocalDateTime(long time) {
        return Instant.ofEpochMilli(time).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
    }

    /**
     * @Author: Max
     * @Date: 2022/11/29
     * @Description: LocalDateTime转Date
     * @Param:
     * @param localDateTime
     * @Return: java.util.Date
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.toInstant(ZoneOffset.ofHours(8)));
    }

    /**
     * @Author: Max
     * @Date: 2022/12/5
     * @Description: 往前推几小时
     * @Param:
     * @param date
     * @param hours 若 hours=5,则为往前推1小时
     * @Return: java.util.Date
     */
    public static Date minusHours(Date date, long hours) {
        LocalTime localTime = dateToLocalTime(date).minusHours(hours);
        LocalDate localDate = dateToLocalDate(date);
        return localDateAndTimeToDate(localDate, localTime);
    }

    public static void main(String[] args) {
        long time = 1669630852714l;

        LocalDate localDate = longToLocalDate(time);
        System.out.println("localDate=" + localDate);
        LocalDateTime localDateTime = longToLocalDateTime(time);
        System.out.println("localDateTime=" + localDateTime);
        Date date2 = localDateTimeToDate(localDateTime);
        Date date = new Date(time);
        Date minusFiveMinutesDate = minusMinutes(date,5);
        System.out.println("minusFiveMinutesDate=" + minusFiveMinutesDate);

        Date minusOneHoursDate = minusHours(date,1);
        System.out.println(minusOneHoursDate);
    }
    
}

好了,完事,趁着疫情别人都窝在家里玩游戏,赶紧卷起来吧!
关注我,升职加薪就是你!

<think>嗯,用户问的是如何将Java中的Date对象转换LocalDate,我需要详细解释这个过程。首先,我记得Java 8引入了新的日期时间API,在java.time包下,包括LocalDateLocalTime这些类。而Date属于旧的API,所以转换的时候可能需要用到中间的Instant类。 用户可能需要将旧的Date对象转换成新的LocalDate来处理日期,比如在数据库操作或者与其他使用新API的库交互时。转换的关键步骤应该是先将Date转为Instant,因为Date有toInstant方法。然后,Instant需要结合时区信息来转换成ZonedDateTime,因为LocalDate是时区相关的,或者至少需要时区来确定具体的日期。 接下来,从ZonedDateTime中提取LocalDate,可以用toLocalDate()方法。这里需要注意的是时区的选择,用户可能希望使用系统默认时区,所以应该用ZoneId.systemDefault()。不过,如果用户有特定的时区需求,也可以自定义ZoneId。 另外,示例代码可能会有异常处理吗?比如,Date如果是null的话会抛出异常,但用户的问题可能不需要考虑这些边界情况,保持示例简单明了更好。此外,是否需要考虑时间部分的影响?比如Date对象包含时间,但转换LocalDate时只需要日期部分,这样转换过程是否会因为时间而影响日期?比如在某个时区中,凌晨的时间可能导致转换后的日期提前或延后一天。这时候可能需要明确说明时区的重要性,或者建议用户确保正确处理时区。 还需要检查是否正确引用了相关的参考资料。根据用户提供的引用,特别是引用3,里面提到了将Date转换为Instant,再转换为ZonedDateTime,然后提取LocalDate。所以步骤应该包括这三个步骤:Date → Instant → ZonedDateTime → LocalDate。 用户可能需要具体的代码示例,所以给出一个完整的Java代码例子会比较好。比如,先创建一个Date对象,然后进行转换,最后打印结果。同时,要导入正确的类,比如java.util.Datejava.time.Instant、java.time.ZoneId、java.time.ZonedDateTime和java.time.LocalDate。 另外,是否需要处理时区的转换问题?比如,如果用户的系统默认时区不是他们想要的,这时候应该怎么调整。但用户的问题可能只需要基本示例,所以保持默认时区即可。 总结步骤应该是:1. 将Date对象转换为Instant。2. 将Instant结合时区转换为ZonedDateTime。3. 从ZonedDateTime获取LocalDate。然后给出代码示例,并解释每一步的作用。可能还需要提到注意事项,比如时区的影响,以及新旧API的区别。 最后,确保回答的结构清晰,分步骤说明,代码正确,并且引用相关的引用资料,如引用3中的方法。这样用户就能明白转换的过程,并且有示例可以参考。</think>### Java DateLocalDate分步说明 #### 关键步骤 1. **Date → Instant**:利用`Date.toInstant()`将旧API的Date对象转为时间基准点 2. **Instant → ZonedDateTime**:通过`atZone()`添加时区信息 3. **ZonedDateTime → LocalDate**:最终提取无时区的日期对象 #### 完整示例代码 ```java import java.util.Date; import java.time.Instant; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.LocalDate; public class DateConversion { public static void main(String[] args) { // 1.创建旧Date对象 Date oldDate = new Date(); // 2.转换为Instant时间戳 Instant instant = oldDate.toInstant(); // 3.添加时区信息(系统默认时区) ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault()); // 4.提取LocalDate LocalDate localDate = zonedDateTime.toLocalDate(); System.out.println("原始Date: " + oldDate); System.out.println("转换LocalDate: " + localDate); } } ``` #### 注意事项 - **时区敏感**:`2023-05-15 23:30:00 GMT+0`在`GMT+8`时区将转为`2023-05-16` - **时间丢失**:转换过程会丢弃时间部分,仅保留年月日 - **空值处理**:若Date对象为null会抛出NullPointerException #### 扩展应用 ```java // 指定特定时区转换(如东京时区) ZonedDateTime tokyoTime = instant.atZone(ZoneId.of("Asia/Tokyo")); LocalDate jpDate = tokyoTime.toLocalDate(); ``` [^3]: 转换过程基于java.time包的时区处理机制,确保时间表示的准确性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

徐先生Paul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值