← 返回首页
JavaSE基础教程(九十一)
发表时间:2020-03-15 16:20:56
讲解LocalDateTime类

自 Java8开始, JDK中其实就增加了一系列表示日期和时间的新类,最典型的就是 LocalDateTime。直言不讳,这玩意的出现就是为了干掉之前 JDK版本中的 Date老哥!

1.为什么抛弃Date

Date存在以下问题: - 结构定义混乱 - API不易用 - 非线程安全 - 国际化困难

2.Java8新的日期时间类常用类

最常用的就是LocalDate,LocalTime,LocalDateTime三个类,API很类似,所以我们以LocalDateTime进行演示,其它两个类用法类似不再赘述。

实例:

public class LocalDateTimeDemo {

    public static void main(String[] args) {

        //获取LocalDateTime对象。
        LocalDateTime date = LocalDateTime.now();
        System.out.println(date);

        //获得当前日期对象的年、月、日、时、分、秒
        System.out.println( "当前年份:" + date.getYear() );
        System.out.println( "当前月份:" + date.getMonth() );
        System.out.println( "当前日份:" + date.getDayOfMonth() );
        System.out.println( "当前时:" + date.getHour() );
        System.out.println( "当前分:" + date.getMinute());
        System.out.println( "当前秒:" + date.getSecond());

        //根据指定日期,构造新的LocalDateTime日期对象
        date = LocalDateTime.of(2019, Month.DECEMBER, 12, 9, 21, 32);
        System.out.println(date.format(DateTimeFormatter.ISO_DATE));
        System.out.println(date.format(DateTimeFormatter.BASIC_ISO_DATE));
        System.out.println(date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss")));


        //LocalDateTime对象转Date对象
        Date d = Date.from(date.atZone(ZoneId.systemDefault()).toInstant());
        System.out.println(d);

        //Date对象转LocalDateTime对象
        date = d.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
        System.out.println(date);

    }
}

运行结果:
2020-03-15T16:19:59.608
当前年份:2020
当前月份:MARCH
当前日份:15
当前时:16
当前分:19
当前秒:59
2019-12-12
20191212
2019年12月12日 09:21:32
Thu Dec 12 09:21:32 CST 2019
2019-12-12T09:21:32

3.Date与LocalDate的转换

项目中日期时间类型字段通常需要定义为Date类型,因此经常需要在LocalDate/LocalDateTime与Date之间进行转换,我们可以自定义一个转换工具类。

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

public class DateUtils {

    public static Date asDate(LocalDate localDate) {
        return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    public static Date asDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    public static LocalDate asLocalDate(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
    }

    public static LocalDateTime asLocalDateTime(Date date) {
        return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
    }
}