Java 8 的日期与时间
日期与时间的类型简述
日期与时间的类型主要包括:java.time.Instant
、java.time.LocalDate
/ java.time.LocalTime
/ java.time.LocalDateTime
、java.time.ZonedDateTime
。
Instant
java.time.Instant 承载纳秒级精度的 Unix 时间,其 String toString() 方法基于 ISO-8601 进行格式化。Instant 不承载时区信息。
LocalDate / LocalTime / LocalDateTime
java.time.LocalDate
用于表示 “本地日期”,无 “时间”。LocalDate
不承载时区信息。java.time.LocalTime
用于表示 “本地时间”,无 “日期”。LocalTime
不承载时区信息。java.time.LocalDateTime
用于表示 “本地日期与时间”。LocalDateTime
不承载时区信息。LocalDate
实例与LocalTime
实例能够共同构建LocalDateTime
实例,由LocalDateTime
实例能够获取LocalDate
实例与LocalTime
实例。
日期工具类Code
package cn.fxbin.bubble.core.util;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
/** * DateUtils 日期操作工具类 * * @author fxbin * @version v1.0 * @since 2019/9/29 17:53 */
@Slf4j
@UtilityClass
public class DateUtils {
/** 标准日期格式:yyyy-MM-dd */
public final String NORM_DATE_PATTERN = "yyyy-MM-dd";
/** 国际标准日期格式:dd-MM-yyyy */
public final String NORM_I18N_DATE_PATTERN = "dd-MM-yyyy";
/** 标准时间格式:HH:mm:ss */
public final String NORM_TIME_PATTERN = "HH:mm:ss";
/** 标准日期时间格式,精确到分:yyyy-MM-dd HH:mm */
public final String NORM_DATETIME_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
/** 标准日期时间格式,精确到秒:yyyy-MM-dd HH:mm:ss */
public final String NORM_DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/** 国际标准时间格式, 精确到秒 dd/MM/yyy HH:mm:ss */
public static final String NORM_I18N_DATETIME_FORMAT = "dd/MM/yyy HH:mm:ss";
/** 标准日期时间格式,精确到毫秒:yyyy-MM-dd HH:mm:ss.SSS */
public final String NORM_DATETIME_MS_PATTERN = "yyyy-MM-dd HH:mm:ss.SSS";
/** 标准日期格式:yyyy年MM月dd日 */
public final String CHINESE_DATE_PATTERN = "yyyy年MM月dd日";
//-------------------------------------------------------------------------------------------------------------------------------- Pure
/** 标准日期格式:yyyyMMdd */
public final String PURE_DATE_PATTERN = "yyyyMMdd";
/** 标准日期格式:HHmmss */
public final String PURE_TIME_PATTERN = "HHmmss";
/** 标准日期格式:yyyyMMddHHmmss */
public final String PURE_DATETIME_PATTERN = "yyyyMMddHHmmss";
/** 标准日期格式:yyyyMMddHHmmssSSS */
public final String PURE_DATETIME_MS_PATTERN = "yyyyMMddHHmmssSSS";
//-------------------------------------------------------------------------------------------------------------------------------- Others
/** HTTP头中日期时间格式:EEE, dd MMM yyyy HH:mm:ss z */
public final String HTTP_DATETIME_PATTERN = "EEE, dd MMM yyyy HH:mm:ss z";
/** JDK中日期时间格式:EEE MMM dd HH:mm:ss zzz yyyy */
public final String JDK_DATETIME_PATTERN = "EEE MMM dd HH:mm:ss zzz yyyy";
/** UTC时间:yyyy-MM-dd'T'HH:mm:ss'Z' */
public final String UTC_PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";
/** * now * * @author fxbin * @return 当前时间 */
public Date now() {
return parseLocalDateTime2Date(LocalDateTime.now());
}
/** * 获取两个日期之间相差天数 * * @author fxbin * @param start 开始日期 * @param end 结束日期 * @return 天数 */
public long getDaysOfBetweenDate(String start, String end) {
LocalDate startDate = LocalDate.parse(start);
LocalDate endDate = LocalDate.parse(end);
return ChronoUnit.DAYS.between(startDate, endDate);
}
/** * 获取两个日期之间相差天数 * * @author fxbin * @param start 开始日期 * @param end 结束日期 * @return 天数 */
public long getDaysOfBetweenDate(Date start, Date end) {
LocalDate startDate = parseDate2LocalDate(start);
LocalDate endDate = parseDate2LocalDate(end);
return ChronoUnit.DAYS.between(startDate, endDate);
}
/** * 是否为当天 * * @author fxbin * @author fxbin * @param date 日期 * @return true|false */
public Boolean isToday(String date) {
LocalDate localDate = LocalDate.parse(date);
if(LocalDate.now().getYear() == localDate.getYear()) {
MonthDay monthDay = MonthDay.from(localDate);
MonthDay today = MonthDay.from(LocalDate.now());
return monthDay.equals(today);
}
return false;
}
/** * 获取当前年月日 * * @author fxbin * @author fxbin * @return 格式化之后的日期 yyyy-MM-dd */
public String getCurDateOfNormDatePattern () {
return getCurDateTime(NORM_DATE_PATTERN);
}
/** * 获取当前年月日时分秒 * * @author fxbin * @return 格式化之后的日期 yyyy-MM-dd HH:mm:ss */
public String getCurDateOfNormDateTimePattern () {
return getCurDateTime(NORM_DATETIME_PATTERN);
}
/** * 获取当前日期,自定义格式 * * @author fxbin * @param format 日期格式 * @return 格式化之后的日期 */
public String getCurDateTime(String format){
return parse(LocalDateTime.now(), format);
}
/** * 日期类型转换 默认 yyyy-MM-dd HH:mm:ss * * @author fxbin * @param date {@code Date} * @return 格式化之后的日期字符 */
public String parse(Date date) {
return parse(parseDate2LocalDateTime(date), NORM_DATETIME_PATTERN);
}
/** * 日期类型转换 * * @author fxbin * @param date {@code Date} * @param format 日期格式 * @return 格式化之后的日期字符 */
public String parse(Date date, String format) {
return parse(parseDate2LocalDateTime(date), format);
}
/** * 日期类型转换 * * @author fxbin * @param localDateTime {@code LocalDateTime} * @param format 日期格式 * @return 格式化之后的日期字符 */
public String parse(LocalDateTime localDateTime, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return localDateTime.format(formatter);
}
/** * 日期类型转换 * * @author fxbin * @param localDate {@code LocalDate} * @param format 日期格式 * @return 格式化之后的日期字符 */
public String parse(LocalDate localDate, String format) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return localDate.format(formatter);
}
// ---------------------------------------------- 获取固定时间段内日期 LocalDateTime ----------------------------------------------------------------------------------
/** * nanoseconds add * * @author fxbin * @param nanos nanoseconds * @return N nanoseconds {@code LocalDateTime#plusNanos(long)} */
public LocalDateTime plusNanos (long nanos) {
return LocalDateTime.now().plusNanos(nanos);
}
/** * N 秒之后 * * @author fxbin * @param seconds 添加的秒数,可能为负 * @return N 秒之后 {@code LocalDateTime} */
public LocalDateTime plusSeconds(long seconds) {
return LocalDateTime.now().plusSeconds(seconds);
}
/** * N 分钟之后 * * @author fxbin * @param minutes 添加的分钟数, 可能为负 * @return N 分钟之后 {@code LocalDateTime} */
public LocalDateTime plusMinutes(long minutes) {
return LocalDateTime.now().plusMinutes(minutes);
}
/** * N 小时之后 * * @author fxbin * @param hours 添加的小时数, 可能为负 * @return N 小时之后 {@code LocalDateTime} */
public LocalDateTime plusHours(long hours) {
return LocalDateTime.now().plusHours(hours);
}
/** * 获取当天起始时间 2019-09-23 00:00:00 * * @author fxbin * @return {@code LocalDateTime} */
public LocalDateTime getTodayStart () {
return LocalDateTime.now().withHour(0).withMinute(0).withSecond(0);
}
// ---------------------------------------------- 获取固定时间段内日期 LocalDate ------------------------------------------------------------------------
/** * 增加|减少天数 * * @author fxbin * @param days 天数 * @return {@link LocalDate} */
public LocalDate plusDays(Integer days) {
return LocalDate.now().plusDays(days);
}
/** * 昨天 * * @author fxbin * @return 昨天 */
public LocalDate yesterday() {
return LocalDate.now().plusDays(-1);
}
/** * 明天 * * @author fxbin * @return 明天 */
public LocalDate tomorrow() {
return LocalDate.now().plusDays(1);
}
/** * 上周 * * @author fxbin * @return 上周 */
public LocalDate lastWeek() {
return LocalDate.now().plusWeeks(-1);
}
/** * 下周 * * @author fxbin * @return 下周 */
public LocalDate nextWeek() {
return LocalDate.now().plusWeeks(1);
}
/** * 上个月 * * @author fxbin * @return 上个月 */
public LocalDate lastMonth() {
return LocalDate.now().plusMonths(-1);
}
/** * 下个月 * * @author fxbin * @return 下个月 */
public LocalDate nextMonth() {
return LocalDate.now().plusMonths(1);
}
/** * 获取上月最后一天 * * @author fxbin * @return 上月最后一天日期{@code LocalDate} */
public LocalDate lastDayOfLastMonth() {
return lastDayOfMonth(-1);
}
/** * 获取当前月最后一天 * * @author fxbin * @return 当前月最后一天日期{@code LocalDate} */
public LocalDate lastDayOfThisMonth() {
return lastDayOfMonth(0);
}
/** * 获取下月最后一天 * * @author fxbin * @return 下月最后一天日期{@code LocalDate} */
public LocalDate lastDayOfNextMonth() {
return lastDayOfMonth(1);
}
/** * 获取上月第一天 * * @author fxbin * @return 上月第一天日期{@code LocalDate} */
public LocalDate firstDayOfLastMonth() {
return firstDayOfMonth(-1);
}
/** * 获取传入日期 月份的第一天 * * @author fxbin * @param date 日期 * @return {@code LocalDate} */
public LocalDate firstDayOfDateMonth(Date date) {
LocalDate reqDate = parseDate2LocalDate(date);
int year = reqDate.getYear();
int month = reqDate.getMonthValue();
return LocalDate.of(year, month, 1);
}
/** * 获取当前月第cc一天 * * @author fxbin * @return 当前月第一天日期{@code LocalDate} */
public LocalDate firstDayOfThisMonth() {
return firstDayOfMonth(0);
}
/** * 获取下月第一天 * * @author fxbin * @return 下月第一天日期{@code LocalDate} */
public LocalDate firstDayOfNextMonth() {
return LocalDate.now().with(TemporalAdjusters.firstDayOfNextMonth());
}
/** * 本年度第一天 * * @author fxbin * @return 本年度第一天 */
public LocalDate firstDayOfYear() {
return firstDayOfYear(0);
}
/** * 获取某月月份第一天日期 * * @author fxbin * @param monthsToAdd 添加的月份数, 可能为负 * @return 基于{@code LocalDate} 添加得到的月份,不为null(a {@code LocalDate} based on this date with the months added, not null) */
public LocalDate firstDayOfMonth(long monthsToAdd) {
return LocalDate.now().plusMonths(monthsToAdd).with(TemporalAdjusters.firstDayOfMonth());
}
/** * 获取某月月份最后一天日期 * * @author fxbin * @param monthsToAdd 添加的月份数, 可能为负 * @return 基于{@code LocalDate} 添加得到的月份,不为null(a {@code LocalDate} based on this date with the months added, not null) */
public LocalDate lastDayOfMonth(long monthsToAdd) {
return LocalDate.now().plusMonths(monthsToAdd).with(TemporalAdjusters.lastDayOfMonth());
}
/** * 某年第一天 * * @author fxbin * @param yearsToAdd 添加的年,可能为负 * @return 某年第一天 */
public LocalDate firstDayOfYear(long yearsToAdd) {
return LocalDate.now().plusYears(yearsToAdd).with(TemporalAdjusters.firstDayOfYear());
}
/** * 某年最后一天 * * @author fxbin * @param yearsToAdd 添加的年,可能为负 * @return 某年最后一天 */
public LocalDate lastDayOfYear(long yearsToAdd) {
return LocalDate.now().plusYears(yearsToAdd).with(TemporalAdjusters.lastDayOfYear());
}
/** * 当前时间是否为闰年 * * @author fxbin * @return 是否闰年 */
public boolean isLeapYear() {
YearMonth yearMonth = YearMonth.from(LocalDate.now());
return yearMonth.isLeapYear();
}
/** * Date -> LocalDate * * @author fxbin * @param date {@code Date} * @return {@code LocalDate} */
public LocalDate parseDate2LocalDate(Date date) {
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
log.info("localDate by Instant: {}", localDate);
return localDate;
}
/** * Date -> LocalDateTime * * @author fxbin * @param date {@code Date} * @return {@code LocalDateTime} */
public LocalDateTime parseDate2LocalDateTime(Date date) {
LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
log.info("localDateTime by Instant: {}", localDateTime);
return localDateTime;
}
/** * Date -> LocalTime * * @author fxbin * @param date {@code Date} * @return {@code LocalTime} */
public LocalTime parseDate2LocalTime(Date date) {
LocalTime localTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalTime();
log.info("localTime by Instant: {}", localTime);
return localTime;
}
/** * LocalDate -> Date * * @author fxbin * @param localDate {@code LocalDate} * @return {@code Date} */
public Date parseLocalDate2Date(LocalDate localDate) {
Date date = Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
log.info("LocalDate -> Date: {}", date);
return date;
}
/** * LocalDateTime -> Date * * @author fxbin * @param localDateTime {@code LocalDateTime} * @return {@code Date} */
public Date parseLocalDateTime2Date(LocalDateTime localDateTime) {
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
log.info("LocalDateTime -> Date: {}", date);
return date;
}
}
如有问题,请与作者沟通,感谢阅读
– end
–
还没有评论,来说两句吧...