All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.cn.lp.common.utils.DateTimeAide Maven / Gradle / Ivy

The newest version!
package com.cn.lp.common.utils;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParseException;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Optional;

/**
 * 时间辅助类
 */
public class DateTimeAide {

    /**
     * 默认时间日期格式化模式
     */
    public static final String DEF_DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 默认日期格式化模式
     */
    public static final String DEF_DATE_PATTERN = "yyyy-MM-dd";

    /**
     * 默认时间格式化模式
     */
    public static final String DEF_TIME_PATTERN = "HH:mm:s`s";

    private static Logger LOGGER = LoggerFactory.getLogger(DateTimeAide.class);

    /**
     * 检查时间是否在今天内
     *
     * @param time
     * @return
     */
    public static boolean isToday(long time) {
        return isSameDay(time, System.currentTimeMillis());
    }

    /**
     * LocalDate: 表示没有时区的日期, LocalDate是不可变并且线程安全的 2020-09-09T14:21:47.892909100
     * LocalTime: 表示没有时区的时间, LocalTime是不可变并且线程安全的 2020-09-09
     * LocalDateTime: 表示没有时区的日期时间, LocalDateTime是不可变并且线程安全的 14:21:47.893908900
     *
     * @param time
     * @return
     */
    public static boolean isToday(LocalDateTime time) {
        return isToday(time.toLocalDate());
    }

    public static boolean isToday(LocalDate date) {
        return isSameDay(date, LocalDate.now());
    }

    /**
     * 检查时间是否在同一天
     * Instant: 用来表示时间线上的一个点(瞬时)
     * Clock: 用于访问当前时刻、日期、时间,用到时区
     * Duration: 用秒和纳秒表示时间的数量(长短),用于计算两个日期的“时间”间隔
     * Period: 用于计算两个“日期”间隔
     *
     * @param time
     * @param otherTime
     * @return
     */
    public static boolean isSameDay(long time, long otherTime) {
        return toDateNum(time) == toDateNum(otherTime);
    }

    public static boolean isSameDay(LocalDate date, LocalDate otherDate) {
        return toDateNum(date) == toDateNum(otherDate);
    }

    /**
     * 自定义格式化日期
     *
     * @param date    日期对象
     * @param pattern 例如:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return "";
        }
        return DateFormatUtils.format(date, pattern);
    }

    /**
     * 自定义格式化日期
     *
     * @param date    日期对象
     * @param pattern 例如:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String format(LocalDateTime date, String pattern) {
        if (date == null) {
            return "";
        }
        return format(toDate(date), pattern);
    }

    /**
     * 自定义格式化日期
     *
     * @param time    日期对象
     * @param pattern 例如:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String format(long time, String pattern) {
        return format(new Date(time), pattern);
    }

    /**
     * 格式化日期 yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static String formatDate(Date date) {
        return format(date, DEF_DATE_PATTERN);
    }

    /**
     * 格式化日期 yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static String formatDate(LocalDateTime date) {
        return format(toDate(date), DEF_DATE_PATTERN);
    }

    /**
     * 格式化日期 HH:mm:s`s
     *
     * @param date
     * @return
     */
    public static String formatTime(Date date) {
        return format(date, DEF_TIME_PATTERN);
    }

    /**
     * 格式化日期 HH:mm:s`s
     *
     * @param date
     * @return
     */
    public static String formatTime(LocalDateTime date) {
        return format(toDate(date), DEF_TIME_PATTERN);
    }

    /**
     * 格式化日期 yyyy-MM-dd HH:mm:ss
     *
     * @param date
     * @return
     */
    public static String formatDateTime(Date date) {
        return format(date, DEF_DATE_TIME_PATTERN);
    }

    /**
     * 格式化日期 yyyy-MM-dd HH:mm:ss
     *
     * @param time
     * @return
     */
    public static String formatDateTime(long time) {
        return format(new Date(time), DEF_DATE_TIME_PATTERN);
    }


    /**
     * 格式化日期 yyyy-MM-dd HH:mm:ss
     *
     * @param date
     * @return
     */
    public static String formatDateTime(LocalDateTime date) {
        return format(toDate(date), DEF_DATE_TIME_PATTERN);
    }

    /**
     * 从字符串转为日期
     *
     * @param str     自定义日期字符串对象
     * @param pattern 例如:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static Optional parse(String str, String pattern){
        try {
            Date date = DateUtils.parseDate(str, pattern);
            return Optional.ofNullable(toLocalDateTime(date));
        } catch (ParseException e) {
            LOGGER.error("[DateTimeAide] parse {}-{} 失败", str, pattern, e);
            return Optional.empty();
        }
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd
     * @return
     */
    public static Optional parseDate(String str) {
        return parse(str, DEF_DATE_PATTERN);
    }

    /**
     * 从字符串转为日期
     *
     * @param str HH:mm:s`s
     * @return
     */
    public static Optional parseTime(String str) {
        return parse(str, DEF_TIME_PATTERN);
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static Optional parseDateTime(String str) {
        return parse(str, DEF_DATE_TIME_PATTERN);
    }

    /**
     * 从字符串转为日期
     *
     * @param str      自定义日期字符串对象
     * @param pattern  例如:yyyy-MM-dd HH:mm:ss
     * @param defValue 默认值
     * @return
     */
    public static LocalDateTime parse(String str, String pattern, LocalDateTime defValue) {
        if (StringUtils.isBlank(str)) {
            return defValue;
        }
        return parse(str, pattern).orElse(defValue);
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd
     * @return
     */
    public static LocalDateTime parseDate(String str, LocalDateTime defValue) {
        return parse(str, DEF_DATE_PATTERN, defValue);
    }

    /**
     * 从字符串转为日期
     *
     * @param str HH:mm:s`s
     * @return
     */
    public static LocalDateTime parseTime(String str, LocalDateTime defValue) {
        return parse(str, DEF_TIME_PATTERN, defValue);
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static LocalDateTime parseDateTime(String str, LocalDateTime defValue) {
        return parse(str, DEF_DATE_TIME_PATTERN, defValue);
    }

    // ========================

    /**
     * 从字符串转为日期
     *
     * @param str     自定义日期字符串对象
     * @param pattern 例如:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static Optional parseOld(String str, String pattern) {
        try {
            return Optional.ofNullable(DateUtils.parseDate(str, pattern));
        } catch (ParseException e) {
            LOGGER.error("[DateTimeAide] parseOld {}-{} 失败", str, pattern, e);
            return Optional.empty();
        }
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd
     * @return
     */
    public static Optional parseOldDate(String str) {
        return parseOld(str, DEF_DATE_PATTERN);
    }

    /**
     * 从字符串转为日期
     *
     * @param str HH:mm:s`s
     * @return
     */
    public static Optional parseOldTime(String str)  {
        return parseOld(str, DEF_TIME_PATTERN);
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static Optional parseOldDateTime(String str) {
        return parseOld(str, DEF_DATE_TIME_PATTERN);
    }

    /**
     * 从字符串转为日期
     *
     * @param str     自定义日期字符串对象
     * @param pattern 例如:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static Date parseOld(String str, String pattern, Date defValue) {
        if (StringUtils.isBlank(str)) {
            return defValue;
        }
        return parseOld(str, pattern).orElse(defValue);
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd
     * @return
     */
    public static Date parseOldDate(String str, Date defValue) {
        return parseOld(str, DEF_DATE_PATTERN, defValue);
    }

    /**
     * 从字符串转为日期
     *
     * @param str HH:mm:s`s
     * @return
     */
    public static Date parseOldTime(String str, Date defValue) {
        return parseOld(str, DEF_TIME_PATTERN, defValue);
    }

    /**
     * 从字符串转为日期
     *
     * @param str yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static Date parseOldDateTime(String str, Date defValue) {
        return parseOld(str, DEF_DATE_TIME_PATTERN, defValue);
    }

    // =========================

    public static LocalDateTime toLocalDateTime(Date date) {
        Instant instant = date.toInstant();
        ZoneId zone = ZoneId.systemDefault();
        return LocalDateTime.ofInstant(instant, zone);
    }

    public static LocalDate toLocalDate(Date date) {
        return toLocalDateTime(date).toLocalDate();
    }

    public static Date toDate(LocalDateTime localDateTime) {
        ZoneId zone = ZoneId.systemDefault();
        Instant instant = localDateTime.atZone(zone).toInstant();
        return Date.from(instant);
    }

    /**
     * 是否比现在迟
     *
     * @param localDateTime
     * @return
     */
    public static boolean isAfterNow(LocalDateTime localDateTime) {
        return localDateTime.isAfter(LocalDateTime.now());
    }

    /**
     * 是否比现在早
     *
     * @param localDateTime
     * @return
     */
    public static boolean isBeforeNow(LocalDateTime localDateTime) {
        return localDateTime.isBefore(LocalDateTime.now());
    }

    public static boolean isEqualOrBeforeNow(LocalDateTime localDateTime) {
        LocalDateTime now = LocalDateTime.now();
        return now.isEqual(localDateTime) || isBeforeNow(localDateTime);
    }

    public static boolean isEqualOrAfterNow(LocalDateTime localDateTime) {
        LocalDateTime now = LocalDateTime.now();
        return now.isEqual(localDateTime) || isAfterNow(localDateTime);
    }

    /**
     * 转成毫秒
     *
     * @param ldt
     * @return
     */
    public static long toMillis(LocalDateTime ldt) {
        return ldt.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    public static Date parseDate(long mills) {
        if (mills <= 0) {
            return null;
        }
        return new Date(mills);
    }

    public static int toTimeNum(LocalDateTime dateTime) {
        return toTimeNum(dateTime.toLocalTime());
    }

    /**
     * 转换为时间数 hhmm
     */
    public static int toTimeNum(LocalTime localTime) {
        int num = localTime.getHour() * 100;
        num += localTime.getMinute();
        return num;
    }

    /**
     * 转换为时间数 hhmm
     */
    public static int toTimeNum(long mills, Duration offset) {
        mills += offset.toMillis();
        return toTimeNum(mills);
    }

    /**
     * 转换为时间数 hhmm
     */
    public static int toTimeNum(Date date, Duration offset) {
        return toTimeNum(date.getTime(), offset);
    }

    /**
     * 转换为日期数 yyyyMMdd
     */
    public static int toTimeNum(Date date) {
        return toDateNum(date.getTime());
    }

    /**
     * 转换为日期数 yyyyMMdd
     */
    public static int toDateNum(long mills) {
        LocalDateTime localDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(mills), ZoneId.systemDefault());
        return toDateNum(localDate);
    }

    /**
     * 转换为时间数 hhmm
     */
    public static int toTimeNum(long mills) {
        LocalDateTime localDate = LocalDateTime.ofInstant(Instant.ofEpochMilli(mills), ZoneId.systemDefault());
        return toTimeNum(localDate);
    }
    /**
     * 转换为日期数 yyyyMMdd
     */
    public static int toDateNum(LocalDateTime dateTime) {
        return toDateNum(dateTime.toLocalDate());
    }

    /**
     * 转换为日期数 yyyyMMdd
     */
    public static int toDateNum(Date date) {
        return toDateNum(date.getTime());
    }

    /**
     * 转换为日期数 yyyyMMdd
     *
     * @param mills  时间戳
     * @param offset 偏移量
     * @return 日期数
     */
    public static int toDateNum(long mills, Duration offset) {
        mills += offset.toMillis();
        return toDateNum(mills);
    }

    /**
     * 转换为日期数 yyyyMMdd
     *
     * @param date   日期时间对象
     * @param offset 偏移量
     * @return 日期数
     */
    public static int toDateNum(Date date, Duration offset) {
        return toDateNum(date.getTime(), offset);
    }

    /**
     * 转换为日期数 yyyyMMdd
     */
    public static int toDateNum(LocalDate localDate) {
        int num = localDate.getYear() * 10000;
        num += localDate.getMonthValue() * 100;
        num += localDate.getDayOfMonth();
        return num;
    }

    public static LocalDate dateNumToLocalDate(int dateNum) {
        int y = dateNum / 10000;
        int m = (dateNum / 100) % 100;
        int d = dateNum % 100;
        return LocalDate.of(y, m, d);
    }

    public static Date dateNumToDate(int dateNum) {
        LocalDate localDate = dateNumToLocalDate(dateNum);
        return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
    }

    /**
     * 获得当前日期数 yyyyMMdd
     */
    public static int nowDateNum() {
        return toDateNum(System.currentTimeMillis());
    }

    /**
     * 格式化日期数
     *
     * @param dateNum yyyyMMdd
     * @param pattern 自定义模式
     */
    public static String formatDateNum(int dateNum, String pattern) {
        return dateNumToLocalDate(dateNum).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化日期数,以 yyyy-MM-dd 模式
     *
     * @param dateNum yyyyMMdd
     */
    public static String formatDateNum(int dateNum) {
        return formatDateNum(dateNum, DEF_DATE_PATTERN);
    }

    public static LocalTime timeNumToLocalTime(int timeNum) {
        int h = (timeNum / 100) % 100;
        int m = timeNum % 100;
        int s = 0;
        return LocalTime.of(h, m, s);
    }

    /**
     * 格式化日期数
     *
     * @param timeNum mmss
     * @param pattern 自定义模式
     */
    public static String formatTimeNum(int timeNum, String pattern) {
        return timeNumToLocalTime(timeNum).format(DateTimeFormatter.ofPattern(pattern));
    }

    /**
     * 格式化日期数,以 yyyy-MM-dd 模式
     *
     * @param timeNum mmss
     */
    public static String formatTimeNum(int timeNum) {
        return formatTimeNum(timeNum, DEF_TIME_PATTERN);
    }


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy