Java 8 的日期與時間

日期與時間的類型簡述

日期與時間的類型主要包括:java.time.Instantjava.time.LocalDate/ java.time.LocalTime / java.time.LocalDateTimejava.time.ZonedDateTime

Instant

java.time.Instant 承載納秒級精度的 Unix 時間,其 String toString() 方法基於 ISO-8601 進行格式化。Instant 不承載時區信息。

LocalDate / LocalTime / LocalDateTime

  1. java.time.LocalDate 用於表示 “本地日期”,無 “時間”。LocalDate 不承載時區信息。
  2. java.time.LocalTime 用於表示 “本地時間”,無 “日期”。LocalTime 不承載時區信息。
  3. java.time.LocalDateTime 用於表示 “本地日期與時間”。LocalDateTime 不承載時區信息。
  4. 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

歡迎關注博主公衆號:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章