java工具类之基于SimpleDateFormat的日期工具类

工具类:

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

/**
 * 基于SimpleDateFormat的日期工具类
 * @author zql
 * 
 * SimpleDateFormat 是线程不安全的类,一般不要定义为 static变量,如果定义为static,必须加锁,或者使用 DateUtils工具类。 
 * 正例:注意线程安全,使用 DateUtils。亦推荐如下处理:
 * private static final ThreadLocal<DateFormat> df = new ThreadLocal<DateFormat>() {
 *     @Override
 * 	   protected DateFormat initialValue() {
 *         return new SimpleDateFormat("yyyy-MM-dd");
 *     }
 * }; 
 * 说明:如果是JDK8 的应用,可以使用Instant代替Date,LocalDateTime代替Calendar,
 * DateTimeFormatter代替 SimpleDateFormat,官方给出的解释:simple  beautiful  strong immutable thread-safe。
 * 
 */
public class DateUtil {
	
	/**
	 * 年,格式:yyyy
	 */
	private final static SimpleDateFormat YEAR = new SimpleDateFormat("yyyy");
	/**
	 * 月,格式:MM
	 */
	private final static SimpleDateFormat MONTH = new SimpleDateFormat("MM");
	/**
	 * 日,格式:dd
	 */
	private final static SimpleDateFormat DAY = new SimpleDateFormat("dd");
	/**
	 * 小时,格式:HH
	 */
	private final static SimpleDateFormat HOUR = new SimpleDateFormat("HH");
	/**
	 * 分钟,格式:mm
	 */
	private final static SimpleDateFormat MINUTE = new SimpleDateFormat("mm");
	/**
	 * 秒钟,格式:ss
	 */
	private final static SimpleDateFormat SECOND = new SimpleDateFormat("ss");
	/**
	 * 年月日,格式:yyyy-MM-dd
	 */
	private final static SimpleDateFormat YEAR_MONTH_DAY = new SimpleDateFormat("yyyy-MM-dd");
	/**
	 * 年月日,格式:yyyyMMdd
	 */
	private final static SimpleDateFormat YEAR_MONTH_DAY2 = new SimpleDateFormat("yyyyMMdd");
	/**
	 * 年月日时分秒,格式:yyyy-MM-dd HH:mm:ss
	 */
	private final static SimpleDateFormat DATE = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	/**
	 * 获取系统当前年份,yyyy格式
	 * 
	 * @return
	 */
	public static String getYear() {
		return YEAR.format(new Date());
	}

	/**
	 * 获取系统当前月份,MM格式
	 * 
	 * @return
	 */
	public static String getMonth() {
		return MONTH.format(new Date());
	}
	
	/**
	 * 获取系统当前日期,dd格式
	 * 
	 * @return
	 */
	public static String getDay() {
		return DAY.format(new Date());
	}
	
	/**
	 * 获取系统当前小时,HH格式
	 * 
	 * @return
	 */
	public static String getHour() {
		return HOUR.format(new Date());
	}
	
	/**
	 * 获取系统当前分钟,mm格式
	 * 
	 * @return
	 */
	public static String getMinute() {
		return MINUTE.format(new Date());
	}
	
	/**
	 * 获取系统当前秒钟,ss格式
	 * 
	 * @return
	 */
	public static String getSecond() {
		return SECOND.format(new Date());
	}
	
	/**
	 * 获取系统当前年月日,yyyy-MM-dd格式
	 * 
	 * @return
	 */
	public static String getYearMonthDay() {
		return YEAR_MONTH_DAY.format(new Date());
	}
	
	/**
	 * 获取系统当前年月日,yyyyMMdd格式
	 * 
	 * @return
	 */
	public static String getYearMonthDay2() {
		return YEAR_MONTH_DAY2.format(new Date());
	}
	
	/**
	 * 获取系统当前日期时间,yyyy-MM-dd HH:mm:ss格式
	 * 
	 * @return
	 */
	public static String getDate() {
		return DATE.format(new Date());
	}
	
	/**
	 * 根据传入的int数字获取系统当前时间
	 * 
	 * @param format 格式类型</br>
	 * 11 格式:yyyy-MM</br>
	 * 12 格式:MM-dd</br>
	 * 13 格式:yyyy-MM-dd</br>
	 * 14 格式:yyyy-MM-dd HH:mm</br>
	 * 15 格式:yyyy-MM-dd HH:mm:ss</br>
	 * 21 格式:yyyyMM</br>
	 * 22 格式:MMdd</br>
	 * 23 格式:yyyyMMdd</br>
	 * 24 格式:yyyyMMddHHmm</br>
	 * 25 格式:yyyyMMddHHmmss</br>
	 * 31 格式:yyyy/MM</br>
	 * 32 格式:MM/dd</br>
	 * 33 格式:yyyy/MM/dd</br>
	 * 34 格式:yyyy/MM/dd HH:mm</br>
	 * 35 格式:yyyy/MM/dd HH:mm:ss</br>
	 * 41 格式:yyyy年MM月</br>
	 * 42 格式:MM月dd日</br>
	 * 43 格式:yyyy年MM月dd日</br>
	 * 44 格式:yyyy年MM月dd日 HH时mm分</br>
	 * 45 格式:yyyy年MM月dd日 HH时mm分ss秒</br>
	 * 51 格式:HH:mm</br>
	 * 52 格式:HH:mm:ss</br>
	 * 53 格式:HH时mm分</br>
	 * 54 格式:HH时mm分ss秒</br>
	 * 默认格式yyyy-MM-dd
	 * @return 自定义的日期格式,共有24种
	 */
	public static String getDateString(int format){
		return getDefinedFormat(getYear(), getMonth(), getMonth(), getHour(), getMinute(), getSecond(),format); 
	}
	
	/**
	 * 时间戳转换为日期格式,根据传入的int数字获取确定要转换成的格式
	 * 
	 * @param times 时间戳
	 * @param format 格式类型</br>
	 * 11 格式:yyyy-MM</br>
	 * 12 格式:MM-dd</br>
	 * 13 格式:yyyy-MM-dd</br>
	 * 14 格式:yyyy-MM-dd HH:mm</br>
	 * 15 格式:yyyy-MM-dd HH:mm:ss</br>
	 * 21 格式:yyyyMM</br>
	 * 22 格式:MMdd</br>
	 * 23 格式:yyyyMMdd</br>
	 * 24 格式:yyyyMMddHHmm</br>
	 * 25 格式:yyyyMMddHHmmss</br>
	 * 31 格式:yyyy/MM</br>
	 * 32 格式:MM/dd</br>
	 * 33 格式:yyyy/MM/dd</br>
	 * 34 格式:yyyy/MM/dd HH:mm</br>
	 * 35 格式:yyyy/MM/dd HH:mm:ss</br>
	 * 41 格式:yyyy年MM月</br>
	 * 42 格式:MM月dd日</br>
	 * 43 格式:yyyy年MM月dd日</br>
	 * 44 格式:yyyy年MM月dd日 HH时mm分</br>
	 * 45 格式:yyyy年MM月dd日 HH时mm分ss秒</br>
	 * 51 格式:HH:mm</br>
	 * 52 格式:HH:mm:ss</br>
	 * 53 格式:HH时mm分</br>
	 * 54 格式:HH时mm分ss秒</br>
	 * 默认格式yyyy-MM-dd
	 * @return 自定义的日期格式,共有24种
	 */
	public static String getDateString(String times, int format){
		long lt = new Long(times);
        Date date = new Date(lt);
        String year = YEAR.format(date);
		String month = MONTH.format(date);
		String day = DAY.format(date);
		String hour = HOUR.format(date);
		String minute = MINUTE.format(date);
		String second = SECOND.format(date);
		return getDefinedFormat(year, month, day, hour, minute, second, format); 
	}
	
	/**
	 * 把日期类型转换成字符串形式,根据传入的int数字获取确定要转换成的格式
	 * 
	 * @param date Date类型的日期
	 * @param format 格式类型</br>
	 * 11 格式:yyyy-MM</br>
	 * 12 格式:MM-dd</br>
	 * 13 格式:yyyy-MM-dd</br>
	 * 14 格式:yyyy-MM-dd HH:mm</br>
	 * 15 格式:yyyy-MM-dd HH:mm:ss</br>
	 * 21 格式:yyyyMM</br>
	 * 22 格式:MMdd</br>
	 * 23 格式:yyyyMMdd</br>
	 * 24 格式:yyyyMMddHHmm</br>
	 * 25 格式:yyyyMMddHHmmss</br>
	 * 31 格式:yyyy/MM</br>
	 * 32 格式:MM/dd</br>
	 * 33 格式:yyyy/MM/dd</br>
	 * 34 格式:yyyy/MM/dd HH:mm</br>
	 * 35 格式:yyyy/MM/dd HH:mm:ss</br>
	 * 41 格式:yyyy年MM月</br>
	 * 42 格式:MM月dd日</br>
	 * 43 格式:yyyy年MM月dd日</br>
	 * 44 格式:yyyy年MM月dd日 HH时mm分</br>
	 * 45 格式:yyyy年MM月dd日 HH时mm分ss秒</br>
	 * 51 格式:HH:mm</br>
	 * 52 格式:HH:mm:ss</br>
	 * 53 格式:HH时mm分</br>
	 * 54 格式:HH时mm分ss秒</br>
	 * 默认格式yyyy-MM-dd
	 * @return 自定义的日期格式,共有24种
	 */
	public static String getDateString(Date date, int format){
        String year = YEAR.format(date);
		String month = MONTH.format(date);
		String day = DAY.format(date);
		String hour = HOUR.format(date);
		String minute = MINUTE.format(date);
		String second = SECOND.format(date);
		return getDefinedFormat(year, month, day, hour, minute, second, format); 
	}
	
	/**
	 * 自定义日期字符串
	 * 
	 * @param year 年
	 * @param month 月
	 * @param day 日
	 * @param hour 时
	 * @param minute 分
	 * @param second 秒
	 * @param format 格式类型</br>
	 * 11 格式:yyyy-MM</br>
	 * 12 格式:MM-dd</br>
	 * 13 格式:yyyy-MM-dd</br>
	 * 14 格式:yyyy-MM-dd HH:mm</br>
	 * 15 格式:yyyy-MM-dd HH:mm:ss</br>
	 * 21 格式:yyyyMM</br>
	 * 22 格式:MMdd</br>
	 * 23 格式:yyyyMMdd</br>
	 * 24 格式:yyyyMMddHHmm</br>
	 * 25 格式:yyyyMMddHHmmss</br>
	 * 31 格式:yyyy/MM</br>
	 * 32 格式:MM/dd</br>
	 * 33 格式:yyyy/MM/dd</br>
	 * 34 格式:yyyy/MM/dd HH:mm</br>
	 * 35 格式:yyyy/MM/dd HH:mm:ss</br>
	 * 41 格式:yyyy年MM月</br>
	 * 42 格式:MM月dd日</br>
	 * 43 格式:yyyy年MM月dd日</br>
	 * 44 格式:yyyy年MM月dd日 HH时mm分</br>
	 * 45 格式:yyyy年MM月dd日 HH时mm分ss秒</br>
	 * 51 格式:HH:mm</br>
	 * 52 格式:HH:mm:ss</br>
	 * 53 格式:HH时mm分</br>
	 * 54 格式:HH时mm分ss秒</br>
	 * 默认格式yyyy-MM-dd
	 * @return
	 */
	public static String getDefinedFormat(String year, String month, String day, String hour, String minute, String second, int format){
		String dateStr = null;
		switch (format) {
		case 11:
			dateStr = year + "-" + month;
			break;
		case 12:
			dateStr = month + "-" +day;
			break;
		case 13:
			dateStr = year + "-" + month + "-" +day;
			break;
		case 14:
			dateStr = year + "-" + month + "-" +day + " " + hour +":"+minute;
			break;
		case 15:
			dateStr = year + "-" + month + "-" +day + " " + hour +":" + minute + ":" + second;
			break;
		case 21:
			dateStr = year + month;
			break;
		case 22:
			dateStr = month + day;
			break;
		case 23:
			dateStr = year + month + day;
			break;
		case 24:
			dateStr = year + month +day + hour + minute;
			break;
		case 25:
			dateStr = year + month + day + hour + minute + second;
			break;
		case 31:
			dateStr = year + "/" + month;
			break;
		case 32:
			dateStr = month + "/" +day;
			break;
		case 33:
			dateStr = year + "/" + month + "/" +day;
			break;
		case 34:
			dateStr = year + "/" + month + "/" +day + " " + hour +":"+minute;
			break;
		case 35:
			dateStr = year + "/" + month + "/" +day + " " + hour +":" + minute + ":" + second;
			break;
		case 41:
			dateStr = year + "年" + month + "月";
			break;
		case 42:
			dateStr = month + "月" +day + "日";
			break;
		case 43:
			dateStr = year + "年" + month + "月" +day + "日";
			break;
		case 44:
			dateStr = year + "年" + month + "月" +day + "日" +" "+ hour + "时" + minute +"分";
			break;
		case 45:
			dateStr = year + "年" + month + "月" +day + "日" +" "+ hour + "时" + minute + "分" +second+ "秒";
			break;
		case 51:
			dateStr = hour + ":" + minute;
			break;
		case 52:
			dateStr = hour + ":" + minute + ":" +second;
			break;
		case 53:
			dateStr = hour + "时" + minute + "分";
			break;
		case 54:
			dateStr = hour + "时" + minute + "分" +second + "秒";
			break;
		default:
			dateStr = year + "-" +month+ "-" + day;
		}
		return dateStr;
	}
	
	/**
	 * 获取SimpleDateFormat的日期
	 * 
	 * @param date 传入的日期
	 * @param format 自定义格式,例:yyyy-MM-dd
	 * @return
	 */
	public static String getSimpleDateFormat(Date date, String format){
		SimpleDateFormat sdf = new SimpleDateFormat(format);
		return sdf.format(date);
	}

	/**
	 * 日期比较
	 * 
	 * @param startDate 开始日期,格式yyyy-MM-dd
	 * @param endDate 结束日期,格式yyyy-MM-dd
	 * @return 如果startDate>endDate,返回1,startDate=endDate返回0,startDate<endDate返回-1
	 */
	public static Integer compareDate(String startDate, String endDate) {
		if (fomatDate(startDate) == null || fomatDate(endDate) == null) {
			return null;
		}
		int r = 0;
		if (fomatDate(startDate).getTime() > fomatDate(endDate).getTime()) {
			r = 1;
		}
		if (fomatDate(startDate).getTime() < fomatDate(endDate).getTime()) {
			r = -1;
		}
		return r;
	}

	/**
	 * 格式化日期
	 * 
	 * @param dateStr日期字符串,格式:yyyy-MM-dd
	 * @return 返回null说明格式错误
	 */
	public static Date fomatDate(String dateStr) {
		try {
			return YEAR_MONTH_DAY.parse(dateStr);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 校验日期是否合法,格式:yyyy-MM-dd
	 * 
	 * @param dateStr日期字符串
	 * @return
	 */
	public static boolean isValidDate(String dateStr) {
		try {
			YEAR_MONTH_DAY.parse(dateStr);
			return true;
		} catch (Exception e) {
			return false;
		}
	}
	
	/**
	 * 校验日期是否合法
	 * 
	 * @param dateStr 日期字符串
	 * @param format 格式,例:yyyy-MM-dd
	 * @return
	 */
	public static boolean isValidDateFormat(String dateStr, String format) {
		DateFormat fmt = new SimpleDateFormat(format);
		try {
			fmt.parse(dateStr);
			return true;
		} catch (Exception e) {
			// 如果throw java.text.ParseException或者NullPointerException,就说明格式不对
			return false;
		}
	}
	
	/**
	 * 时间相减得到年份,不够365天算0年
	 * 
	 * @param startDate 开始日期,格式yyyy-MM-dd
	 * @param endDate 结束日期,格式yyyy-MM-dd
	 * @return 返回相隔的年数,null表示格式不正确出现异常
	 */
	public static Integer getDiffYear(String startDate, String endDate) {
		try {
			int years = (int) (((fomatDate(endDate).getTime() - fomatDate(startDate).getTime()) / (1000 * 60 * 60 * 24)) / 365);
			return years;
		} catch (Exception e) {
			// 如果throw,就说明格式不对
			return null;
		}
	}
	
    /**
     * 时间相减得到天数
     * 
     * @param startDate 开始日期,格式yyyy-MM-dd
     * @param endDate 结束日期,格式yyyy-MM-dd
     * @return 返回相隔的天数,null表示格式不正确出现异常
     */
    public static Integer getDaySub(String startDate, String endDate){
        try {
        	int days = (int) (((fomatDate(endDate).getTime() - fomatDate(startDate).getTime()) / (1000 * 60 * 60 * 24)));
			return days;
		} catch (Exception e) {
			// 如果throw,就说明格式不对
			return null;
		}
    }
    
    /**
     * 得到n天之后的日期
     * 
     * @param days
     * @return
     */
    public static String getAfterDayDate(int days) {
    	// java.util包
        Calendar canlendar = Calendar.getInstance();
        // 日期相减,如果不够减将会向月变动
        canlendar.add(Calendar.DATE, days);
        Date date = canlendar.getTime();
        
        return DATE.format(date);
    }
    
    /**
     * 得到n天之后是周几
     * 
     * @param days
     * @return
     */
    public static String getAfterDayWeek(int days) {
    	// java.util包
        Calendar canlendar = Calendar.getInstance(); 
        // 日期相减,如果不够减将会向月变动
        canlendar.add(Calendar.DATE, days); 
        Date date = canlendar.getTime();
        
        SimpleDateFormat sdf = new SimpleDateFormat("E");
        
        return sdf.format(date);
    }

}

测试类:

import java.util.Date;

public class DateUtilTest {
	
	public static void main(String[] args) {
		System.out.println("年:" + DateUtil.getYear());
		System.out.println("月:" + DateUtil.getMonth());
		System.out.println("日:" + DateUtil.getDay());
		System.out.println("时:" + DateUtil.getHour());
		System.out.println("分:" + DateUtil.getMinute());
		System.out.println("秒:" + DateUtil.getSecond());
		System.out.println("年月日:" + DateUtil.getYearMonthDay());
		System.out.println("年月日:" + DateUtil.getYearMonthDay2());
		System.out.println("年月日时分秒:" + DateUtil.getDate());
		
		System.out.println(DateUtil.getDateString(15));
		String str = System.currentTimeMillis() + "";
		System.out.println(DateUtil.getDateString(str,15));
		System.out.println(DateUtil.getDateString(new Date(), 15));
		System.out.println(DateUtil.getSimpleDateFormat(new Date(),"yyyy-MM-dd HH:mm"));
		System.out.println(DateUtil.compareDate("2019-11-19", "2019-04-19"));
		System.out.println(DateUtil.compareDate("2019-04-19", "2019-04-19"));
		System.out.println(DateUtil.compareDate("2019-04-19", "2019-11-19"));
		
		System.out.println(DateUtil.isValidDate("2019-11-19"));
		System.out.println(DateUtil.isValidDate("2019-11>19"));
		System.out.println(DateUtil.isValidDateFormat("2019>11>19", "yyyy>mm>dd"));
		
		System.out.println(DateUtil.getDiffYear("2010-01-08","2019-01-02"));
		System.out.println(DateUtil.getDiffYear("2019","2019-01-02"));
		
		System.out.println(DateUtil.getAfterDayWeek(7));
		System.out.println(DateUtil.getAfterDayDate(7));
	}
}

发布了55 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/mr_zql/article/details/100059427