java 时间工具类封装

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;

import java.lang.management.ManagementFactory;
import java.security.SecureRandom;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.*;

/**
 * 时间工具类
 *
 * @author GZQ
 */
@Slf4j
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
    public static String YYYY = "yyyy";

    public static String YYYY_MM = "yyyy-MM";

    public static String YYYY_MM_DD = "yyyy-MM-dd";

    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    static SimpleDateFormat etcFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
    static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    private static String[] parsePatterns = {"yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM-dd", "yyyy-MM", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM/dd", "yyyy/MM", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM.dd", "yyyy.MM"};

    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 获取当前日期, 默认格式为yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate() {
        return dateTimeNow(YYYY_MM_DD);
    }

    public static final String getTime() {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }

    public static final String dateTimeNow() {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }

    public static final String dateTimeNow(final String format) {
        return parseDateToStr(format, new Date());
    }

    public static final String dateTime(final Date date) {
        return parseDateToStr(YYYY_MM_DD, date);
    }

    public static final String format_yyyy_MM_dd_HH_mm_ss(final Date date) {
        return parseDateToStr(YYYY_MM_DD_HH_MM_SS, date);
    }

    public static final String format_yyyy_MM_dd_HH_mm_ss(final long date) {
        return parseDateToStr(YYYY_MM_DD_HH_MM_SS, new Date(date));
    }

    public static final String dateTime(final Date date, final String format) {
        return parseDateToStr(format, date);
    }

    public static final String parseDateToStr(final String format, final Date date) {
        return new SimpleDateFormat(format).format(date);
    }

    public static final Date dateTime(final String format, final String source) {
        try {
            return new SimpleDateFormat(format).parse(source);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 日期路径 即年/月/日 如2018/08/08
     */
    public static final String datePath() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyy/MM/dd");
    }

    /**
     * 日期路径 即年/月/日 如20180808
     */
    public static final String dateTime() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyyMMdd");
    }

    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 获取服务器启动时间
     */
    public static Date getServerStartDate() {
        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
        return new Date(time);
    }

    /**
     * 计算两个时间差
     */
    public static String getDatePoor(Date endDate, Date nowDate) {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        // long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = endDate.getTime() - nowDate.getTime();
        // 计算差多少天
        long day = diff / nd;
        // 计算差多少小时
        long hour = diff % nd / nh;
        // 计算差多少分钟
        long min = diff % nd % nh / nm;
        // 计算差多少秒//输出结果
        // long sec = diff % nd % nh % nm / ns;
        return day + "天" + hour + "小时" + min + "分钟";
    }

    /**
     * 增加 LocalDateTime ==> Date
     */
    public static Date toDate(LocalDateTime temporalAccessor) {
        ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }

    /**
     * 增加 LocalDate ==> Date
     */
    public static Date toDate(LocalDate temporalAccessor) {
        LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
        ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }

    public static String getHour(String dateStr) {
        DateTime parse = DateUtil.parse(dateStr);
        return DateUtil.format(parse, "HH:00:00");
    }

    public static String getDay(String dateStr) {
        DateTime parse = DateUtil.parse(dateStr);
        return DatePattern.NORM_DATE_FORMAT.format(parse);
    }

    public static String getMonth(String dateStr) {
        DateTime parse = DateUtil.parse(dateStr);
        return DatePattern.NORM_MONTH_FORMAT.format(parse);
    }

    public static String getYear(String dateStr) {
        DateTime parse = DateUtil.parse(dateStr);
        return String.valueOf(DateUtil.year(parse));
    }

    public static void main(String[] args) {
//		String hour = DateUtils.getHour("2022-09-01 01:29:00");
//		System.out.println(hour);
        String randomDateTimeStr = DateUtils.getRandomDateTimeStr("2023-02-01 00:00:00", "2023-12-01 00:00:00");
        System.out.println(randomDateTimeStr);
    }

    public static String convertFileDate() {
        Date now = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String sdf = format.format(now);
        return sdf.substring(0, 4) + "." + sdf.substring(5, 7) + "." + sdf.substring(8, 10);
    }

    public static String convertTitleDate() {
        Date now = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String sdf = format.format(now);
        return sdf.substring(0, 4) + "." + sdf.substring(5, 7) + "." + sdf.substring(8, 10) + " 00:00-" + sdf.substring(11, 16);
    }

    public static Integer queryHour() {
        Date now = new Date();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String sdf = format.format(now);
        String substring = sdf.substring(11, 13);
        return Integer.parseInt(substring);
    }

    /**
     * 开始时间加1天
     */
    public static String addDateDay(String startTime) {
        // 自动感应格式
        Date date = DateUtil.parse(startTime);
        // 日期时间偏移
        DateTime dateTime = DateUtil.offsetDay(date, 1);
        return DateUtil.format(dateTime, "yyyy-MM-dd");
    }

    public static int getDaysOfMonth(String mouth) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        try {
            Date parse = sdf.parse(mouth);
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(parse);
            return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * <code>
     * liuzc
     * n年后的时间
     * </code>
     *
     * @return
     */
    public static final String nyearsLater(final String now, final int n) {
        if (now == null) {
            throw new RuntimeException("参数错误");
        }
        Calendar calendar = Calendar.getInstance();
        Date nowDate = DateUtil.parse(now);
        if (nowDate == null) {
            throw new RuntimeException("parse失败2");
        }
        calendar.setTime(nowDate);
        calendar.add(Calendar.YEAR, n);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }

    /**
     * <code>
     * liuzc
     * n天后的时间
     * </code>
     *
     * @return
     */
    public static final String ndaysLater(final String now, final int n) {
        if (now == null) {
            throw new RuntimeException("参数错误");
        }
        Calendar calendar = Calendar.getInstance();
        Date nowDate = DateUtil.parse(now);
        if (nowDate == null) {
            throw new RuntimeException("parse失败3");
        }
        calendar.setTime(nowDate);
        calendar.add(Calendar.DAY_OF_MONTH, n);
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
    }

    /**
     * <code>
     * liuzc
     * n天后的时间
     * </code>
     *
     * @return
     */
    public static final Date ndaysLater(final Date now, final int n) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.DAY_OF_MONTH, n);
        return calendar.getTime();
    }

    /**
     * @return
     */
    public static final Date nhoursLater(final Date now, final int n) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.HOUR, n);
        return calendar.getTime();
    }

    /**
     * @return
     */
    public static final Date nminutesLater(final Date now, final int n) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.MINUTE, n);
        return calendar.getTime();
    }


    /**
     * <code>
     * liuzc
     * n天后的时间
     * </code>
     *
     * @return
     */
    public static final Date nsecondsLater(final Date now, final int n) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(now);
        calendar.add(Calendar.SECOND, n);
        return calendar.getTime();
    }


    /**
     * <code>
     * liuzc
     * 间隔几天
     * </code>
     *
     * @return
     */
    public static final int daysInterval(final String begin, final String end) {
        Calendar calendar = Calendar.getInstance();
        Date beginDate = null;
        Date endDate = null;
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            beginDate = sdf.parse(begin);
            endDate = sdf.parse(end);
        } catch (Exception e) {
            throw new RuntimeException("parse失败");
        }
        if (beginDate == null || endDate == null) {
            throw new RuntimeException("parse失败");
        }
        calendar.setTime(beginDate);
        long begin1 = calendar.getTimeInMillis();
        calendar.setTime(endDate);
        long end1 = calendar.getTimeInMillis();
        long days = (end1 - begin1) / (1000 * 3600 * 24);
        return Long.valueOf(days).intValue();
    }

    /**
     * <code>
     * liuzc
     * 间隔几分钟
     * </code>
     *
     * @return
     */
    public static final int minutesInterval(final Date begin, final Date end) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(begin);
        long begin1 = calendar.getTimeInMillis();
        calendar.setTime(end);
        long end1 = calendar.getTimeInMillis();
        long minutes = (end1 - begin1) / (1000 * 60);
        return Long.valueOf(minutes).intValue();
    }

    public static String getDateYYYYMMDDStr(String date) {
        try {
            // DateUtils.parseDateToStr(YYYY_MM_DD_HH_MM_SS,new
            // SimpleDateFormat(YYYY_MM_DD_HH_MM_SS).parse(date));
            return DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, new SimpleDateFormat(DateUtils.YYYY_MM_DD).parse(date));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
        if (nowTime.getTime() == startTime.getTime() || nowTime.getTime() == endTime.getTime()) {
            return true;
        }

        Calendar date = Calendar.getInstance();
        date.setTime(nowTime);

        Calendar begin = Calendar.getInstance();
        begin.setTime(startTime);

        Calendar end = Calendar.getInstance();
        end.setTime(endTime);

        return date.after(begin) && date.before(end);
    }

    public static boolean isEffectiveDate(String nowTime, String startTime, String endTime) {
        if (StringUtils.isBlank(nowTime) || StringUtils.isBlank(startTime) || StringUtils.isBlank(endTime)) {
            return false;
        }
        Date nowDate = parseDate(nowTime);
        Date startDate = parseDate(startTime);
        Date endDate = parseDate(endTime);
        return isEffectiveDate(nowDate, startDate, endDate);
    }

    public static String etcTodayStartTime() {
        return etcFormat.format(DateUtil.beginOfDay(new Date()));
    }

    public static String etcTodayEndTime() {
        return etcFormat.format(DateUtil.date());
    }

    public static String todayStartTime() {
        return format.format(DateUtil.beginOfDay(new Date()));
    }

    public static String todayEndTime() {
        return format.format(DateUtil.date());
    }

    public static Date parseDateShanghai(final String str, final String parsePattern) throws ParseException {

        if (str == null || parsePatterns == null) {
            throw new IllegalArgumentException("Date and Patterns must not be null");
        }

        final TimeZone tz = TimeZone.getTimeZone("GMT+8:00");
        final Locale lcl = Locale.CHINA;
        final Calendar calendar = Calendar.getInstance(tz, lcl);
        calendar.setLenient(false);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(parsePattern);
        simpleDateFormat.setCalendar(calendar);
        simpleDateFormat.setTimeZone(tz);
        return simpleDateFormat.parse(str);
    }

    public static Date parseDateShanghai(final String str) {

        if (str == null || parsePatterns == null) {
            throw new IllegalArgumentException("Date and Patterns must not be null");
        }

        final TimeZone tz = TimeZone.getTimeZone("GMT+8:00");
        final Locale lcl = Locale.CHINA;
        final Calendar calendar = Calendar.getInstance(tz, lcl);
        calendar.setLenient(false);

        Date ret = null;
        for (String p : parsePatterns) {
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(p);
            simpleDateFormat.setCalendar(calendar);
            simpleDateFormat.setTimeZone(tz);
            try {
                ret = simpleDateFormat.parse(str);
                break;
            } catch (ParseException e) {
            }
        }

        return ret;
    }

    public static final ThreadLocal<SimpleDateFormat> DATE_TIME_TL_FORMAT = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

    public static String getRandomDateTimeStr(String startTime, String endTime) {
        try {
            SimpleDateFormat sdf = DATE_TIME_TL_FORMAT.get();

            // 指定开始日期
            long start = sdf.parse(startTime).getTime();
            // 指定结束日期
            long end = sdf.parse(endTime).getTime();
            DATE_TIME_TL_FORMAT.remove();

            // 调用方法产生随机数
            long randomDate = nextLong(start, end);
            // 格式化输出日期
            String format = String.format("%1$tF %1$tT", randomDate);
            return format;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    private static long nextLong(long start, long end) {
        SecureRandom random = new SecureRandom();
        return start + (long) (random.nextDouble() * (end - start + 1));
    }

    // 获取近七天日期
    public static List<String> getSevenDate() {
        List<String> dateList = new ArrayList<>();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        for (int i = 0; i < 7; i++) {
            Date date = DateUtils.addDays(new Date(), -i);
            String formatDate = sdf.format(date);
            dateList.add(formatDate);
        }
        return dateList;
    }

    public static Date dateToISODate(Date dateStr) {
        Date parse = null;
        try {
// 解析字符串时间
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
            format.setCalendar(new GregorianCalendar(new SimpleTimeZone(0, "GMT")));
            parse = format.parse(format.format(dateStr));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parse;
    }

    /*** 如果是字符串需要先转成date 再调用 dateToISODate() 方法* @param strDate* @return */
    public static Date strToDateLong(String strDate) {
        Date strtodate = null;
        try {
            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            strtodate = formatter.parse(strDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return strtodate;
    }

}

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值