日期與時間的類型簡述
日期與時間的類型主要包括: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
–
歡迎關注博主公衆號
: