自 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();
}
}