Java8 的时间日期 API 经过优化使用起来相当的便捷,本文将常用的时间日期方法作记录,可当工具类使用。
Java8 常用时间日期类
Java8 将时间日期 API 做了重写,使用起来更加的方便易懂。
几种常用的日期时间类:
-
LocalDateTime
、LocalDate
、LocalTime
:本地的时间日期类。 -
ZonedDateTime
:带时区的时间日期类。 -
Instant
:瞬时类,代表某个时间点。以1970-01-01 08:00:00 为起点开始,发生在这之后的为正值,这之前的为负值,精确到纳秒。
-
ZoneId
:时区类。 -
ZoneOffset
:时区偏移量 -
Period
、Duration
、ChronoUnit
:周期、持续时间、测量时间间隔
Date、LocalDateTime、LocalDate 互转
// LocalDateTime -> Date
public static Date toDate(LocalDateTime localDateTime) {
if (Objects.isNull(localDateTime)) {
return null;
}
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
// Date -> LocalDateTime
public static LocalDateTime toLocalDateTime(Date date) {
if (Objects.isNull(date)) {
return null;
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
}
// LocalDate -> Date
public static Date toDate(LocalDate localDate) {
if (Objects.isNull(localDate)) {
return null;
}
return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
}
// Date -> LocalDate
public static LocalDate toLocalDate(Date date) {
if (Objects.isNull(date)) {
return null;
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
LocalDateTime、timestamp 互转
// LocalDateTime -> timestamp
public static LocalDateTime toLocalDateTime(long timestamp) {
return Instant.ofEpochMilli(timestamp).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
// timestamp -> LocalDateTime
public static long toTimestamp(LocalDateTime localDateTime) {
return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
LocalDateTime、String 互转
public class DateTimeUtil {
// 定义用到的时间格式
enum DateTimeFormatStyle {
yyyy_MM_dd_HH_mm_ss("yyyy-MM-dd HH:mm:ss"),
yyyyMMdd("yyyyMMdd"),
yyyyMMddHHmmss("yyyyMMddHHmmss"),
yyyyMMddHHmmssSSS("yyyyMMddHHmmssSSS"),
yyyy_MM_dd_T_HH_mm_ss_XXX("yyyy-MM-dd'T'HH:mm:ssXXX"); // like 2019-12-20T18:30:06+08:00
@Getter
private final String code;
DateTimeFormatStyle(String code) {
this.code = code;
}
}
// LocalDateTime -> String
public static String format(LocalDateTime localDateTime, DateTimeFormatStyle dateTimeFormatStyle) {
if (Objects.isNull(localDateTime)) {
return null;
}
return DateTimeFormatter.ofPattern(dateTimeFormatStyle.getCode()).format(localDateTime);
}
// String -> LocalDateTime
public static LocalDateTime parse(String dateTimeString, DateTimeFormatStyle dateTimeFormatStyle) {
if(StringUtils.isBlank(dateTimeString)){
return null;
}
return LocalDateTime.parse(dateTimeString, DateTimeFormatter.ofPattern(dateTimeFormatStyle.getCode()));
}
}
时间日期计算
在 Java8 中对时间日期的计算非常简单。
计算时间差值
LocalDateTime startTime = LocalDateTime.of(2021,1,10, 10,0,0);
LocalDateTime endTime = LocalDateTime.of(2021,1,15, 11,0,0);
long days = startTime.until(endTime, ChronoUnit.DAYS);
// 另一种方式
long days1 = ChronoUnit.DAYS.between(startTime, endTime);
long hours = startTime.until(endTime, ChronoUnit.HOURS);
long seconds = startTime.until(endTime, ChronoUnit.SECONDS);
System.out.println(days); // 5
System.out.println(days1); // 5
System.out.println(hours); // 121
System.out.println(seconds); // 435600
计算日期差值
返回 天时分秒 格式,需要自己计算:
LocalDateTime startTime = LocalDateTime.of(2021,10,10, 12,12,1);
LocalDateTime endTime = LocalDateTime.of(2021,12,15, 18,16,5);
long startSecond = startTime.toEpochSecond(ZoneOffset.ofHours(8));
long endSecond = endTime.toEpochSecond(ZoneOffset.ofHours(8));
long diffSecond = Math.abs(startSecond - endSecond);
long s = diffSecond % 60;
long m = diffSecond / 60 % 60;
long h = diffSecond / 60 / 60 % 24;
long d = diffSecond / 60 / 60 / 24;
// 两个时间相差:66 天 6 时 4 分 4 秒
System.out.printf("两个日期相差:%d 天 %d 时 %d 分 %d 秒", d, h, m, s);
返回 年月日 格式:
LocalDate startDate = LocalDate.of(2021,10,10);
LocalDate endDate = LocalDate.of(2023,9,15);
Period p = Period.between(startDate, endDate);
// 两个日期相差:1 年 2 月 5 天
System.out.printf("两个日期相差:%d 年 %d 月 %d 天 \n", p.getYears(), p.getMonths(), p.getDays());
时间加值
LocalDateTime startTime = LocalDateTime.of(2021,1,10, 10,0,0);
System.out.println(startTime.plus(10L, ChronoUnit.DAYS)); // 2021-01-20T10:00
// 简洁方式
System.out.println(startTime.plusMonths(1L)); // 2021-02-10T10:00
时间减值
LocalDateTime startTime = LocalDateTime.of(2021,1,10, 10,0,0);
System.out.println(startTime.minus(10L, ChronoUnit.DAYS)); // 2020-12-31T10:00
// 简洁方式
System.out.println(startTime.plusHours(1L)); // 2021-01-10T11:00
时间判断
LocalDateTime startTime = LocalDateTime.of(2021,10,10, 12,12,1);
LocalDateTime endTime = LocalDateTime.of(2021,12,15, 18,16,5);
System.out.println(startTime.isEqual(endTime)); // false
System.out.println(startTime.isBefore(endTime)); // true
System.out.println(startTime.isAfter(endTime)); // false
System.out.println(startTime.toLocalDate().isLeapYear()); // 是否是闰年 false