要求环境在JDK8以上
package com.ch.util;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* 时间工具类
* @author 019530
* @date 2020-07-01
*/
public class DateUtils {
/**
* LocalDateTime
* 1.生成对象(ISO 8601规范)
* LocalDateTime.now()
* LocalDateTime.of(2020, 07, 01, 15, 00, 00)
* LocalDateTime dt = LocalDateTime.parse("2020-07-01T15:00:00")
* 2.调整时间
* withYear() withMonth() 等方法设置时间
* time.plusDays() time.plusHours() 等增加时间
* time.minusDays() time.minusHours() 等减少时间
* 3.比较时间
* .isBefore() .isAfter()
* 4.额外的时间获取
* .firstDayOfNextMonth() .lastDayOfMonth()
*
* ZonedDateTime
* LocalDateTime总是表示本地日期和时间,要表示一个带时区的日期和时间,就需要ZonedDateTime (ZonedDateTime=LocalDateTime+ZoneId)
* 1.LocalDateTime.atZone(ZoneId.systemDefault()) -> ZonedDateTime
*
* Instant
* Instant.now().toEpochMilli()获取当前13位时间戳
* Instant.now().getEpochSecond() 获取当前10位的时间戳
*
* Duration
* LocalDateTime之间的时间间隔
* 1. Duration.toDays() .toHours() 获取时间间隔的天数 小时数
* 2. plus() minus() 时间间隔再加上时间 或者 减去时间
*
*/
public static DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
public static DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 将 String 转化成 LocalDateTime (format)
* @param time 字符串
* @param format 格式
* @return LocalDateTime
*/
public static LocalDateTime parseStringToDateTime(String time, String format) {
DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
return LocalDateTime.parse(time, df);
}
/**
* 将 LocalDateTime 转化成 String (format)
* @param dateTime 日期时间
* @param format 格式
* @return String
*/
public static String parseDateTimeToString(LocalDateTime dateTime, String format) {
DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
return dateTime.format(df);
}
/**
* Date类型转化为LocalDateTime
* @param date 日期
* @return LocalDateTime
*/
public static LocalDateTime date2DateTime(Date date) {
return LocalDateTime.ofInstant(date.toInstant(), ZoneOffset.systemDefault());
}
/**
* LocalDateTime 类型转化为 Date
* @param time 日期时间
* @return Date
*/
public static Date dateTime2Date(LocalDateTime time) {
return Date.from(time.atZone(ZoneOffset.systemDefault()).toInstant());
}
/**
* LocalDateTime 转化为 时间戳 (正8时区)
* @param time 日期时间
* @return Long
*/
public static Long getMilliByDateTime(LocalDateTime time) {
return time.toInstant(OffsetDateTime.now().getOffset()).toEpochMilli();
}
/**
* 时间戳(10位) 转化为 LocalDateTime (正8时区)
* @param seconds 秒数
* @return LocalDateTime
*/
public static LocalDateTime getDateTimeBySeconds(Long seconds) {
return LocalDateTime.ofEpochSecond(seconds,0, ZoneOffset.of("+8"));
}
/**
* 时间戳(13位) 转化为 LocalDateTime (正8时区)
* @param milliseconds 毫秒数
* @return LocalDateTime
*/
public static LocalDateTime getDateTimeByMills(Long milliseconds) {
return Instant.ofEpochMilli(milliseconds).atZone(ZoneOffset.of("+8")).toLocalDateTime();
}
/**
* 获取两个LocalDateTime之间的时间间隔
* @param start 开始时间
* @param end 结束时间
* @return Duration
*/
public static Duration getDuration(LocalDateTime start, LocalDateTime end) {
return Duration.between(start, end);
}
}