Java时间格式化处理工具类

本文介绍了一个日期处理工具类,提供了多种日期格式化方法,包括日期转换、格式化、解析等功能。支持多种日期格式,如 yyyyMMddHHmmss、yyyy-MM-dd HH:mm:ss 等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

/**
 * 日期处理工具类
 */
public class DateUtil {
    // 本地线程变量
    private static final ThreadLocal<Map<String, SimpleDateFormat>> formatsCache = new ThreadLocal<Map<String, SimpleDateFormat>>();
    public static final String DATE_FORMATE_STRING_DEFAULT = "yyyyMMddHHmmss";
    public static final String DATE_FORMATE_STRING_A = "yyyy-MM-dd HH:mm:ss";
    public static final String DATE_FORMATE_STRING_B = "yyyy-MM-dd";
    public static final String DATE_FORMATE_STRING_C = "MM/dd/yyyy HH:mm:ss a";
    public static final String DATE_FORMATE_STRING_D = "yyyy-MM-dd HH:mm:ss a";
    public static final String DATE_FORMATE_STRING_E = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    public static final String DATE_FORMATE_STRING_F = "yyyy-MM-dd'T'HH:mm:ssZ";
    public static final String DATE_FORMATE_STRING_G = "yyyy-MM-dd'T'HH:mm:ssz";
    public static final String DATE_FORMATE_STRING_H = "yyyyMMdd";
    public static final String DATE_FORMATE_STRING_I = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String DATE_FORMATE_STRING_J = "yyyyMMddHHmmss.SSS";

    /**
     * 初始化
     */
    public static void initDateFormatCache() {
        Map<String, SimpleDateFormat> formats = new HashMap<String, SimpleDateFormat>();
        formats.put(DATE_FORMATE_STRING_DEFAULT, new SimpleDateFormat(DATE_FORMATE_STRING_DEFAULT));
        formats.put(DATE_FORMATE_STRING_A, new SimpleDateFormat(DATE_FORMATE_STRING_A));
        formats.put(DATE_FORMATE_STRING_B, new SimpleDateFormat(DATE_FORMATE_STRING_B));
        formats.put(DATE_FORMATE_STRING_C, new SimpleDateFormat(DATE_FORMATE_STRING_C));
        formats.put(DATE_FORMATE_STRING_D, new SimpleDateFormat(DATE_FORMATE_STRING_D));
        formats.put(DATE_FORMATE_STRING_E, new SimpleDateFormat(DATE_FORMATE_STRING_E));
        formats.put(DATE_FORMATE_STRING_F, new SimpleDateFormat(DATE_FORMATE_STRING_F));
        formats.put(DATE_FORMATE_STRING_G, new SimpleDateFormat(DATE_FORMATE_STRING_G));
        formats.put(DATE_FORMATE_STRING_H, new SimpleDateFormat(DATE_FORMATE_STRING_H));
        formats.put(DATE_FORMATE_STRING_I, new SimpleDateFormat(DATE_FORMATE_STRING_I));
        formats.put(DATE_FORMATE_STRING_J, new SimpleDateFormat(DATE_FORMATE_STRING_J));
        formatsCache.set(formats);
    }

    /**
     * 将Date转换为 pattern 格式的字符串,格式为:
     * yyyyMMddHHmmss
     * yyyy-MM-dd HH:mm:ss
     * yyyy-MM-dd
     * MM/dd/yyyy HH:mm:ss a
     * yyyy-MM-dd HH:mm:ss a
     * yyyy-MM-dd'T'HH:mm:ss'Z'
     * yyyy-MM-dd'T'HH:mm:ssZ
     * yyyy-MM-dd'T'HH:mm:ssz
     *
     * @param date    日期
     * @param pattern 日期格式
     * @return String --格式化的日期字符串
     * @see Date
     */
    public static String getFormatTimeString(Date date, String pattern) {
        SimpleDateFormat sDateFormat = getDateFormat(pattern);
        //单实例,SimpleDateFormat非线程安全
        synchronized (sDateFormat) {
            return sDateFormat.format(date);
        }
    }

    /**
     * 将Date转换为默认的YYYYMMDDHHMMSS 格式的字符串
     *
     * @param date
     * @return
     */
    public static String getDefaultFormateTimeString(Date date) {
        return getFormatTimeString(date, DATE_FORMATE_STRING_DEFAULT);
    }

    /**
     * 根据pattern取得的date formate
     *
     * @param pattern
     * @return
     */
    public static SimpleDateFormat getDateFormat(String pattern) {
        if (formatsCache.get() == null || formatsCache.get().isEmpty()) {
            initDateFormatCache(); // 先初始化本地线程表
        }
        SimpleDateFormat sDateFormat = formatsCache.get().get(pattern);
        if (sDateFormat == null) {
            sDateFormat = new SimpleDateFormat(pattern);
            formatsCache.get().put(pattern, sDateFormat);
        }
        return sDateFormat;
    }

    /**
     * 将格式将日期字符串转换为Date对象
     *
     * @param date    字符串
     * @param pattern 格式如下:
     *                yyyyMMddHHmmss
     *                yyyy-MM-dd HH:mm:ss
     *                yyyy-MM-dd
     *                MM/dd/yyyy HH:mm:ss a
     *                yyyy-MM-dd HH:mm:ss a
     *                yyyy-MM-dd'T'HH:mm:ss'Z'
     *                yyyy-MM-dd'T'HH:mm:ssZ
     *                yyyy-MM-dd'T'HH:mm:ssz
     * @return 日期Date对象
     * @throws ParseException
     * @see Date
     */
    public static Date getDateFromString(String date, String pattern) throws ParseException {
        SimpleDateFormat sDateFormat = getDateFormat(pattern);
        //单实例,SimpleDateFormat非线程安全
        synchronized (sDateFormat) {
            return sDateFormat.parse(date);
        }
    }

    /**
     * 将日期字符串转化成默认格式YYYYMMDDHHMMSS的Date对象
     *
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date getDefaultDateFromString(String date) throws ParseException {
        return getDateFromString(date, DATE_FORMATE_STRING_DEFAULT);
    }

    /**
     * 取当前时间,格式为YYYYMMDDHHMMSS的日期字符串
     *
     * @return 当前日期字符串
     * @throws ParseException
     * @see Date
     */
    public static String getNowDefault() {
        return getNow(DATE_FORMATE_STRING_DEFAULT);
    }

    /**
     * 按照pattern格式取当前日期字符串
     *
     * @param pattern 日期字符串格式
     * @return 格式化后的当前日期字符串
     */
    public static String getNow(String pattern) {
        return getFormatTimeString(new Date(), pattern);
    }

    /**
     * 取当前时间,格式为YYYYMMDD
     *
     * @return 当前日期字符串
     * @throws ParseException
     * @see Date
     */
    public static String getNowII() {
        return getFormatTimeString(new Date(), DATE_FORMATE_STRING_H);
    }

    /**
     * 将输入pattern格式的日期字符串转换为取时间的毫秒数 since 1976
     *
     * @return 时间毫秒数
     * @throws ParseException
     * @see Date
     */
    public static long dateString2Long(String str, String pattern) throws ParseException {
        return getDateFromString(str, pattern).getTime();
    }

    /**
     * 把since1976的毫秒数转成默认格式yyyyMMddHHmmss的String日期字符串
     *
     * @param time
     * @return
     */
    public static String longToDateStringDefault(long time) {
        return getFormatTimeString(new Date(time), DATE_FORMATE_STRING_DEFAULT);
    }

    /**
     * 将时间的毫秒数 since 1976转换为按照pattern格式的日期字符串
     *
     * @return 日期字符串
     * @see Date
     */
    public static String longToDateString(long time, String pattern) {
        return getFormatTimeString(new Date(time), pattern);
    }

    /**
     * 将Date对象转成since 1976的毫秒数
     *
     * @param date
     * @return since1976的毫秒数
     */
    public static long date2Long(Date date) {
        return date.getTime();
    }

    /**
     * 将since1976毫秒数转成Date对象
     *
     * @param time
     * @return
     */
    public static Date longToDate(long time) {
        return new Date(time);
    }

    /**
     * 自动适配两种格式的日期字符串转换为date对象
     * A格式	:	yyyy-MM-dd HH:mm:ss
     * B格式	:	yyyy-MM-dd
     *
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date getDateFromStringAdaptTwoPattern(String date) throws ParseException {
        try {
            return getDateFromString(date, DATE_FORMATE_STRING_A);
        } catch (ParseException e) {
            return getDateFromString(date, DATE_FORMATE_STRING_B);
        }
    }

    /**
     * for test
     *
     * @author root
     */
    static class Tm extends Thread {
        public String str = null;

        public Tm(String str) {
            this.str = str;
        }

        @Override
        public void run() {
            while (true) {
                Date date = null;
                ;
                try {
                    date = DateUtil.getDefaultDateFromString(str);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                System.out.println(DateUtil.getDefaultFormateTimeString(date));
            }
        }
    }

 /**
     * 获取上个月
     * A格式	:	yyyyMM
     *
     * @param date
     * @return
     * @throws ParseException
     */
    public static String getDateFromLastMonth() throws ParseException {
        try {
            Date dt = new Date();
            Calendar calendar= Calendar.getInstance();
            calendar.setTime(dt);
            calendar.set(Calendar.MONTH,calendar.get(Calendar.MONTH)-1);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
            return sdf.format(calendar.getTime());
        } catch (Exception e) {
            return "";
        }
    }
    
    public static Date getNowDate() {
        Calendar c = Calendar.getInstance();
        Date nowTime = c.getTime();
        return nowTime;
    }

    /**
     * for test
     *
     * @param args
     */
  public static void main(String[] args) {
        Date dt = new Date();
        //最后的aa表示“上午”或“下午”    HH表示24小时制    如果换成hh表示12小时制
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss aa");
        System.out.println(sdf.format(dt));//输出:2019-04-03 16:05:39 下午
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值