处理java.util.Date日期的格式工具

package com.freedom.demo.utils;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author tobebetter9527
 * @description 处理日期工具,适用于java.util.Date
 * @create 2020/05/02 16:32
 */
@Slf4j
public class DateUtil {
    private DateUtil() {
    }

    private static final String DATE_FORMAT = "yyyy-MM-dd";
    private static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    private static final ThreadLocal<Map<String, DateFormat>> dateThreadLocal = new ThreadLocal<>();


    /**
     * format Date, yyyy-MM-dd
     *
     * @param date
     * @return
     */
    public static String formatDate(Date date) {
        return format(date, DATE_FORMAT);
    }

    /**
     * format Date, yyyy-MM-dd HH:mm:ss
     *
     * @param date
     * @return
     */
    public static String formateDateTime(Date date) {
        return format(date, DATETIME_FORMAT);
    }

    /**
     * format date
     *
     * @param date
     * @param pattern
     * @return
     */
    public static String format(Date date, String pattern) {
        return getDateFormat(pattern).format(date);
    }

    /**
     * parse date,yyyy-MM-dd
     *
     * @param dateStr
     * @return
     */
    public static Date parseDate(String dateStr) {
        return parse(dateStr, DATE_FORMAT);
    }

    /**
     * parse Date, yyyy-MM-dd HH:mm:ss
     *
     * @param dateStr
     * @return
     */
    public static Date parseDateTime(String dateStr) {
        return parse(dateStr, DATETIME_FORMAT);
    }

    /**
     * parse date
     *
     * @param dateStr
     * @param pattern
     * @return
     */
    public static Date parse(String dateStr, String pattern) {
        try {
            return getDateFormat(pattern).parse(dateStr);
        } catch (ParseException e) {
            log.error("parse date error dateStr={}, pattern={}", dateStr, pattern, e);
        }
        return null;
    }


    public static Date addYears(Date date, int amount) {
        return add(date, Calendar.YEAR, amount);
    }

    public static Date addMonths(Date date, int amount) {
        return add(date, Calendar.MONTH, amount);
    }

    public static Date addDays(Date date, int amount) {
        return add(date, Calendar.DAY_OF_MONTH, amount);
    }

    public static Date addHours(Date date, int amount) {
        return add(date, Calendar.HOUR_OF_DAY, amount);
    }

    public static Date addMinutes(Date date, int amount) {
        return add(date, Calendar.MINUTE, amount);
    }


    private static Date add(Date date, int calendarField, int amount) {
        if (date == null) {
            return null;
        }
        Calendar instance = Calendar.getInstance();
        instance.setTime(date);
        instance.add(calendarField, amount);
        return instance.getTime();
    }

    /**
     * 同个线程,可以避免创建很多个DateFormat.
     *
     * @param pattern
     * @return
     */
    private static DateFormat getDateFormat(String pattern) {
        // 校验入参
        if (StringUtils.isBlank(pattern)) {
            throw new IllegalArgumentException("pattern can't be empty");
        }

        // 获取DateFormat
        Map<String, DateFormat> dateFormatMap = dateThreadLocal.get();
        if (dateFormatMap != null && dateFormatMap.containsKey(pattern)) {
            return dateFormatMap.get(pattern);
        }

        synchronized (dateThreadLocal) {
            if (dateFormatMap == null) {
                dateFormatMap = new HashMap<>();
            }
            dateFormatMap.put(pattern, new SimpleDateFormat(pattern));
            dateThreadLocal.set(dateFormatMap);
        }

        return dateFormatMap.get(pattern);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值