JAVA日期运算工具(含日期字符串运算)—DateCalendar


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

public class DateCalendar {
    /**
     * 日期字符串向后加的结果
     *
     * @param srcDateStr 日期字符串,支持,YYYY,YYYY-MM,YYYY-MM-DD,YYYY-MM-DD HH:mm:ss
     * @param field      时间字段,year,month,date,week,day,hour,minute,second,除了minute都只认第1个字母
     * @param addNum     运算数量
     * @return
     * @throws ParseException
     */
    public static String strDateAdd(String srcDateStr, String field, int addNum) throws ParseException {
        int specified = getSpecified(field);
        return strDateAdd(srcDateStr, specified, addNum);
    }

    /**
     * 日期字符串运算的结果
     *
     * @param srcDateStr 日期字符串,格式,YYYY,YYYY-MM,YYYY-MM-DD,YYYY-MM-DD HH:mm:ss,yyyy-MM-dd HH:mm:ss.SSS
     * @param specified  时间字段类型,Calendar.DAY_OF_MONTH等
     * @param addNum     运算数量
     * @return
     * @throws ParseException
     */
    public static String strDateAdd(String srcDateStr, int specified, int addNum) throws ParseException {
        Date srcDate = getDate(srcDateStr);
        Date newDate = dateAdd(srcDate, specified, addNum);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        return sdf.format(newDate).substring(0, srcDateStr.length());
    }

    public static Date dateAfter(Date srcDate, String field, int addNum) throws ParseException {
        int specified = getSpecified(field);
        return dateAdd(srcDate, specified, addNum);
    }

    public static Date dateAdd(Date srcDate, int specified, int addNum) throws ParseException {
        Calendar cal = Calendar.getInstance();
        cal.setTime(srcDate);
        cal.add(specified, addNum);
        return cal.getTime();
    }

    private static Date getDate(String srcDateStr) throws ParseException {
        String dateStr = srcDateStr;
        if (dateStr == null) dateStr = "";
        if (dateStr.length() == 4) {
            dateStr += "-01-01";
        } else if (dateStr.length() == 7) {
            dateStr += "-01";
        }
        String fmt = "yyyy-MM-dd";
        if (dateStr.length() == 19) {
            fmt = "yyyy-MM-dd HH:mm:ss";
        } else if (dateStr.length() == 23) {
            fmt = "yyyy-MM-dd HH:mm:ss.SSS";
        }
        SimpleDateFormat df = new SimpleDateFormat(fmt);
        return df.parse(dateStr);
    }

    private static int getSpecified(String field) {
//        时间变动类型,year,month,date,week,day,hour,minute,second,除了minute都只认第1个字母
        if (field == null) field = "D";
        int itype = Calendar.DAY_OF_MONTH;
        field = field.toUpperCase();
        if (field.startsWith("Y")) {
            itype = Calendar.YEAR;
        } else if (field.startsWith("MI")) {
            itype = Calendar.MINUTE;
        } else if (field.startsWith("M")) {
            itype = Calendar.MONTH;
        } else if (field.startsWith("D")) {
            itype = Calendar.DAY_OF_MONTH;
        } else if (field.startsWith("W")) {
            itype = Calendar.WEEK_OF_YEAR;
        } else if (field.startsWith("H")) {
            itype = Calendar.HOUR_OF_DAY;
        } else if (field.startsWith("S")) {
            itype = Calendar.SECOND;
        }
        return itype;
    }
}
posted @ 2025-08-15 09:59  山䂥进城  阅读(5)  评论(0)    收藏  举报