【自用】Java时间转换工具

时间转换工具

在Java开发中,时间处理是一个常见的需求,无论是记录日志、数据库操作还是前后端交互,正确地格式化和解析时间是至关重要的。本文将通过介绍一个实用的时间转换工具类DateUtil,来展示如何高效且线程安全地进行日期与字符串之间的转换,以及日期的简单计算。代码如下:

public class DateUtil {
    private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);
    public static final String DATE_FORMAT = "yyyy-MM-dd";
    public static final String DATETIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
    public static final String DATETIME_FULL = "yyyyMMddHHmmssSSS";
    public static final String DATETIME_UTC = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    private static final ThreadLocal<Map<String, DateFormat>> dateFormatThreadLocal = ThreadLocal.withInitial(ConcurrentHashMap::new);

    public DateUtil() {
    }


    private static DateFormat getDateFormat(String pattern) {
        if (pattern == null || pattern.trim().isEmpty()) {
            throw new BusinessException(ErrorCode.PARAM_REQUIRED);
        }
        Map<String, DateFormat> dateFormatMap = dateFormatThreadLocal.get();
        DateFormat dateFormat = dateFormatMap.get(pattern);
        if (dateFormat == null) {
            synchronized (dateFormatThreadLocal) {
                dateFormat = dateFormatMap.get(pattern);
                if (dateFormat == null) {
                    dateFormat = new SimpleDateFormat(pattern);
                    dateFormatMap.put(pattern, dateFormat);
                }
            }
        }
        return dateFormat;
    }

    /**
     * 将 Date 对象格式化为字符串。
     *
     * @param date 需要被格式化的 Date 对象。
     * @return 格式化后的日期字符串,格式为"yyyy-MM-dd"。
     */
    public static String formatDate(Date date) {
        return format(date, DATE_FORMAT);
    }

    /**
     * 将 Date 对象格式化为字符串。
     *
     * @param date 需要被格式化的 Date 对象。
     * @return 格式化后的日期字符串,格式为"yyyy-MM-dd HH:mm:ss"。
     */
    public static String formatDateTime(Date date) {
        return format(date, DATETIME_FORMAT);
    }

    /**
     * 将 Date 对象格式化为字符串。
     *
     * @param date 需要被格式化的 Date 对象。
     * @return 格式化后的日期字符串,格式为"yyyyMMddHHmmssSSS"。
     */
    public static String formatDateTimeFull(Date date) {
        return format(date, DATETIME_FULL);
    }

    /**
     * 将 Date 对象格式化为字符串。
     *
     * @param date 需要被格式化的 Date 对象。
     * @return 格式化后的日期字符串,格式为"yyyy-MM-dd'T'HH:mm:ss'Z'"。
     */
    public static String formatDateTimeUTC(Date date) {
        return format(date, DATETIME_UTC);
    }

    /**
     * 将 Date 对象格式化为字符串。
     *
     * @param date 需要被格式化的 Date 对象。
     * @return 格式化后的日期字符串,格式为指定的日期格式。
     */
    public static String format(Date date, String patten) {
        return getDateFormat(patten).format(date);
    }

    /**
     * 解析日期时间字符串为Date对象。
     *
     * @param dateString 待解析的日期时间字符串,格式为"yyyy-MM-dd"。
     * @return 返回解析后的Date对象。
     */
    public static Date parseDate(String dateString) {
        return parse(dateString, DATE_FORMAT);
    }

    /**
     * 解析日期时间字符串为Date对象。
     *
     * @param dateString 待解析的日期时间字符串,格式为"yyyy-MM-dd HH:mm:ss"。
     * @return 返回解析后的Date对象。
     */
    public static Date parseDateTime(String dateString) {
        // 使用预定义的日期时间格式解析字符串
        return parse(dateString, DATETIME_FORMAT);
    }

    /**
     * 解析日期时间字符串为Date对象。
     *
     * @param dateString 待解析的日期时间字符串,格式为"yyyyMMddHHmmssSSS"。
     * @return 返回解析后的Date对象。
     */
    public static Date parseDateTimeFull(String dateString) {
        return parse(dateString, DATETIME_FULL);
    }

    /**
     * 解析日期时间字符串为Date对象。
     *
     * @param dateString 待解析的日期时间字符串,格式为"yyyy-MM-dd'T'HH:mm:ss'Z'"。
     * @return 返回解析后的Date对象。
     */
    public static Date parseDateTimeUTC(String dateString) {
        return parse(dateString, DATETIME_UTC);
    }

    /**
     * 解析日期时间字符串为Date对象。
     *
     * @param dateString 待解析的日期时间字符串,格式为指定的日期格式。
     * @return 返回解析后的Date对象。
     */
    public static Date parse(String dateString, String pattern) {
        try {
            return getDateFormat(pattern).parse(dateString);
        } catch (Exception var3) {
            logger.warn("parse date error, dateString = {}, pattern={}; errorMsg = {}", dateString, pattern, var3.getMessage());
            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.DATE, 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;
        } else {
            Calendar c = Calendar.getInstance();
            c.setTime(date);
            c.add(calendarField, amount);
            return c.getTime();
        }
    }
}

示例代码

Date now = new Date();
String formattedDate = DateUtil.formatDate(now); // 格式化日期
System.out.println(formattedDate);

String futureDateStr = DateUtil.formatDate(DateUtil.addDays(now, 7)); // 计算一周后日期并格式化
System.out.println(futureDateStr);

Date parsedDate = DateUtil.parseDate("2023-12-9"); // 解析字符串为日期
System.out.println(parsedDate);
  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值