编程大椰子

V1

2022/07/22阅读:18主题:萌绿

Java8 时间日期使用总结

Java8 的时间日期 API 经过优化使用起来相当的便捷,本文将常用的时间日期方法作记录,可当工具类使用。

Java8 常用时间日期类

Java8 将时间日期 API 做了重写,使用起来更加的方便易懂。

几种常用的日期时间类:

  • LocalDateTimeLocalDateLocalTime:本地的时间日期类。

  • ZonedDateTime:带时区的时间日期类。

  • Instant:瞬时类,代表某个时间点。以1970-01-01 08:00:00 为起点开始,发生在这之后的为正值,这之前的为负值,精确到纳秒。

  • ZoneId:时区类。

  • ZoneOffset:时区偏移量

  • PeriodDurationChronoUnit:周期、持续时间、测量时间间隔

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,1010,0,0);
LocalDateTime endTime = LocalDateTime.of(2021,1,1511,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,1012,12,1);
LocalDateTime endTime = LocalDateTime.of(2021,12,1518,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,1010,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,1010,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,1012,12,1);
LocalDateTime endTime = LocalDateTime.of(2021,12,1518,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

分类:

后端

标签:

Java

作者介绍

编程大椰子
V1

微信公众号:编程大椰子