在业务开发中,我们经常需要进行
Date
与LocalDateTime
的相互转换。
下面我们一起来学习一下吧!
talk is cheap, show me the code.
Date ⇒ LocalDateTime
- 方式一:使用 Instant 的
atZone
进行转换 - 方式二:使用 LocalDateTime 的
ofEpochSecond
进行转换 - 方式三:使用 LocalDateTime 的
ofInstant
进行转换(封装的 ofEpochSecond 方法)
Date date = new Date();
// @since 1.8
Instant instant = date.toInstant();
// 设置时区
ZoneOffset zoneOffset = ZoneOffset.of("+8");
// 方式一:使用 Instant 的 atZone 进行转换
LocalDateTime localDateTime1 = instant.atZone(zoneOffset).toLocalDateTime();
LocalDate localDate = instant.atZone(zoneOffset).toLocalDate();
LocalTime localTime = instant.atZone(zoneOffset).toLocalTime();
// 方式二:使用 LocalDateTime 的 ofEpochSecond 进行转换
LocalDateTime localDateTime2 = LocalDateTime.ofEpochSecond(instant.getEpochSecond(), instant.getNano(), zoneOffset);
// 方式三:使用 LocalDateTime 的 ofInstant 进行转换(封装的 ofEpochSecond 方法)
LocalDateTime localDateTime3 = LocalDateTime.ofInstant(instant, zoneOffset);
LocalDateTime ⇒ Date
LocalDateTime now = LocalDateTime.now();
// 设置时区
ZoneOffset zoneOffset = ZoneOffset.of("+8");
Instant instant = now.toInstant(zoneOffset);
// @since 1.8
Date date = Date.from(instant);
扩展
Instant
:表示时刻,不直接对应年月日信息,需要通过时区转换LocalDateTime
: 表示与时区无关的日期和时间信息,不直接对应时刻,需要通过时区转换LocalDate
:表示与时区无关的日期,与LocalDateTime相比,只有日期信息,没有时间信息LocalTime
:表示与时区无关的时间,与LocalDateTime相比,只有时间信息,没有日期信息ZonedDateTime
: 表示特定时区的日期和时间ZoneId/ZoneOffset
:表示时区
时间格式化
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now()));
System.out.println(DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDate.now()));
System.out.println(DateTimeFormatter.ofPattern("HH:mm:ss").format(LocalTime.now()));
控制台输出
2020-06-13 12:42:49
2020-06-13
12:42:49