Java8新特性 - LocalDate、LocalDateTime、ZoneDateTime 与 Date 的相互转换

1.需求概述

Java8中提供了新的日期时间类,帮助我们更便捷的操作日期和时间对象。
针对原来的Date类,如何在新的日期时间对象与Date类之间相互转化,本文做出详细的总结。

2.Java8中的Date与各类之间的关系

各个类的功能说明如下 : 
LocalDate :  Java8 日期类(默认时区,中国就是东八区)
LocalTime :  Java8 时间类(默认时区,中国就是东八区)
LocalDateTime : Java8 日期时间类(默认时区,中国就是东八区)
Instant :  Java8 时间戳类
ZoneDateTime :  Java8 带时区的日期时间类
Date : Java中的Date类,包 java.util.Date

关键的转换思路,可以根据下面的图进行理解:

在这里插入图片描述

3.具体的转换关系

下面的各个转换思路直接看代码,(结合上面的图更好理解)

3.1 LocalDate 转 Date

package com.northcastle.K_Date;

import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;

public class LocalDateTimeAndDate {
    public static void main(String[] args) {
        //0.准备一个Date的格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        /**
         * 1.LocalDate 转 Date
         *  思路1 : LocalDate --> LocalDateTime --> Instant --> Date
         *  思路2 : LocalDate --> LocalDateTime --> ZoneDateTime --> Instant --> Date
         */
        LocalDate localDate01 = LocalDate.of(2022, 3, 25);
        LocalDateTime localDateTime01 = localDate01.atStartOfDay(); // 将 时分秒 设置为0
        // 思路一 :
        Instant instant0101 = localDateTime01.toInstant(ZoneOffset.of("+8")); //【这也是一种转换 Instant 的方法】
        Date date0101 = Date.from(instant0101);
        //思路二 :
        ZonedDateTime zonedDateTime01 = localDateTime01.atZone(ZoneId.systemDefault());
        Instant instant0102 = zonedDateTime01.toInstant();
        Date date0102 = Date.from(instant0102);

        System.out.println("localDate01 = " + localDate01);
        System.out.println("localDateTime01 = " + localDateTime01);
        System.out.println("zonedDateTime01 = " + zonedDateTime01);
        System.out.println("instant0101 = " + instant0101);
        System.out.println("date0101 = " + sdf.format(date0101));
        System.out.println("instant0102 = " + instant0102);
        System.out.println("date0102 = " + sdf.format(date0102));
        System.out.println("=======================");
       
    }
}

在这里插入图片描述

3.2 LocalDateTime 转 Date

package com.northcastle.K_Date;

import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;

public class LocalDateTimeAndDate {
    public static void main(String[] args) {
        //0.准备一个Date的格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

          /**
         * 2.LocalDateTime 转 Date
         * 思路1 : LocalDateTime --> Instant --> Date
         * 思路2 : LocalDateTime --> ZoneDateTime --> Instant --> Date
         */
        LocalDateTime localDateTime02 = LocalDateTime.of(2022, 3, 25, 22, 34, 30);
        // 思路一 :
        Instant instant0201 = localDateTime02.toInstant(ZoneOffset.of("+8"));
        Date date0201 = Date.from(instant0201);
        // 思路二 :
        ZonedDateTime zonedDateTime02 = localDateTime02.atZone(ZoneId.systemDefault());
        Instant instant0202 = zonedDateTime02.toInstant();
        Date date0202 = Date.from(instant0202);
        System.out.println("localDateTime02 = " + localDateTime02);
        System.out.println("zonedDateTime02 = " + zonedDateTime02);
        System.out.println("instant0201 = " + instant0201);
        System.out.println("date0201 = " + sdf.format(date0201));
        System.out.println("instant0202 = " + instant0202);
        System.out.println("date0202 = " + sdf.format(date0202));
        System.out.println("=======================");
    }
}

在这里插入图片描述

3.3 ZoneDateTime 转 Date

package com.northcastle.K_Date;

import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;

public class LocalDateTimeAndDate {
    public static void main(String[] args) {
        //0.准备一个Date的格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
     
        /**
         * 3.ZoneDateTime 转 Date
         * 思路 : ZoneDateTime --> Instant --> Date
         */
        ZonedDateTime zonedDateTime03 = ZonedDateTime.of(2022, 3, 25, 22, 36, 56, 0, ZoneId.systemDefault());
        Instant instant03 = zonedDateTime03.toInstant();
        Date date03 = Date.from(instant03);
        System.out.println("zonedDateTime03 = " + zonedDateTime03);
        System.out.println("instant03 = " + instant03);
        System.out.println("date03 = " + sdf.format(date03));
        System.out.println("=======================");
    }
}

在这里插入图片描述

3.4 Date 转 ZoneDateTime

package com.northcastle.K_Date;

import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;

public class LocalDateTimeAndDate {
    public static void main(String[] args) {
        //0.准备一个Date的格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        /**
         * 4.Date 转 ZoneDateTime
         * 思路 : Date --> Instant --> ZoneDateTime
         */
        Date date04 = new Date();
        Instant instant04 = date04.toInstant();
        ZonedDateTime zonedDateTime04 = ZonedDateTime.ofInstant(instant04, ZoneId.systemDefault());
        System.out.println("date04 = " + sdf.format(date04));
        System.out.println("instant04 = " + instant04);
        System.out.println("zonedDateTime04 = " + zonedDateTime04);
        System.out.println("=======================");
    }
}

在这里插入图片描述

3.5 Date 转 LocalDateTime

package com.northcastle.K_Date;

import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;

public class LocalDateTimeAndDate {
    public static void main(String[] args) {
        //0.准备一个Date的格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        /**
         * 5.Date 转 LocalDateTime
         * 思路1 : Date --> Instant --> ZoneDateTime --> LocalDateTime
         * 思路2 : Date --> Instant --> LocalDateTime.of(Instant,ZoneId)
         */
        Date date05 = new Date();
        Instant instant05 = date05.toInstant();
        //思路一 : Date --> Instant --> ZoneDateTime --> LocalDateTime
        LocalDateTime localDateTime0501 = ZonedDateTime.ofInstant(instant05, ZoneId.systemDefault()).toLocalDateTime();
        //思路二 : Date --> Instant --> LocalDateTime.of(Instant,ZoneId)
        LocalDateTime localDateTime0502 = LocalDateTime.ofInstant(instant05, ZoneId.systemDefault());

        System.out.println("date05 = " + sdf.format(date05));
        System.out.println("instant05 = " + instant05);
        System.out.println("localDateTime0501 = " + localDateTime0501);
        System.out.println("localDateTime0502 = " + localDateTime0502);
        System.out.println("=======================");
    }
}

在这里插入图片描述

3.6 Date 转 LocalDate

package com.northcastle.K_Date;

import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;

public class LocalDateTimeAndDate {
    public static void main(String[] args) {
        //0.准备一个Date的格式化对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        /**
         * 6.Date 转 LocalDate
         * 思路1 : Date --> Instant --> ZoneDateTime --> LocalDateTime --> LocalDate
         * 思路2 : Date --> Instant --> LocalDateTime.of(Instant,ZoneId) --> LocalDate
         */
        Date date06 = new Date();
        Instant instant06 = date06.toInstant();
        //思路一 : Date --> Instant --> ZoneDateTime --> LocalDateTime --> LocalDate
        LocalDate localDate0601 = ZonedDateTime.ofInstant(instant06, ZoneId.systemDefault()).toLocalDateTime().toLocalDate();
        //思路二 : Date --> Instant --> LocalDateTime.of(Instant,ZoneId) --> LocalDate
        LocalDate localDate0602 = LocalDateTime.ofInstant(instant06, ZoneId.systemDefault()).toLocalDate();

        System.out.println("date06 = " + sdf.format(date06));
        System.out.println("instant06 = " + instant06);
        System.out.println("localDate0601 = " + localDate0601);
        System.out.println("localDate0602 = " + localDate0602);
        System.out.println("=======================");
    }
}

在这里插入图片描述

4.完成

Congratulations!
You are one step closer to success!

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值