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

工具类:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.util.Calendar;
import java.util.Date;

/**
 * 基于DateTimeFormatter的日期工具类
 * @author zql
 * 
 */
public class DateUtil {
	
	/**
	 * 年,格式:yyyy
	 */
	private final static DateTimeFormatter YEAR = DateTimeFormatter.ofPattern("yyyy");
	/**
	 * 月,格式:MM
	 */
	private final static DateTimeFormatter MONTH = DateTimeFormatter.ofPattern("MM");
	/**
	 * 日,格式:dd
	 */
	private final static DateTimeFormatter DAY = DateTimeFormatter.ofPattern("dd");
	/**
	 * 小时,格式:HH
	 */
	private final static DateTimeFormatter HOUR = DateTimeFormatter.ofPattern("HH");
	/**
	 * 分钟,格式:mm
	 */
	private final static DateTimeFormatter MINUTE = DateTimeFormatter.ofPattern("mm");
	/**
	 * 秒钟,格式:ss
	 */
	private final static DateTimeFormatter SECOND = DateTimeFormatter.ofPattern("ss");
	/**
	 * 年月日,格式:yyyy-MM-dd
	 */
	private final static DateTimeFormatter YEAR_MONTH_DAY = DateTimeFormatter.ofPattern("yyyy-MM-dd");
	/**
	 * 年月日,格式:yyyyMMdd
	 */
	private final static DateTimeFormatter YEAR_MONTH_DAY2 = DateTimeFormatter.ofPattern("yyyyMMdd");
	/**
	 * 年月日时分秒,格式:yyyy-MM-dd HH:mm:ss
	 */
	private final static DateTimeFormatter DATE = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

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

	/**
	 * 获取系统当前月份,MM格式
	 * 
	 * @return
	 */
	public static String getMonth() {
		return LocalDate.now().format(MONTH);
	}
	
	/**
	 * 获取系统当前日期,dd格式
	 * 
	 * @return
	 */
	public static String getDay() {
		return LocalDate.now().format(DAY);
	}
	
	/**
	 * 获取系统当前小时,HH格式
	 * 
	 * @return
	 */
	public static String getHour() {
		return LocalDateTime.now().format(HOUR);
	}
	
	/**
	 * 获取系统当前分钟,mm格式
	 * 
	 * @return
	 */
	public static String getMinute() {
		return LocalDateTime.now().format(MINUTE);
	}
	
	/**
	 * 获取系统当前秒钟,ss格式
	 * 
	 * @return
	 */
	public static String getSecond() {
		return LocalDateTime.now().format(SECOND);
	}
	
	/**
	 * 获取系统当前年月日,YYYY-MM-DD格式
	 * 
	 * @return
	 */
	public static String getYearMonthDay() {
		return LocalDate.now().format(YEAR_MONTH_DAY);
	}
	
	/**
	 * 获取系统当前年月日,YYYYMMDD格式
	 * 
	 * @return
	 */
	public static String getYearMonthDay2() {
		return LocalDate.now().format(YEAR_MONTH_DAY2);
	}
	
	/**
	 * 获取系统当前日期时间,YYYY-MM-DD HH:mm:ss格式
	 * 
	 * @return
	 */
	public static String getDate() {
		return LocalDateTime.now().format(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) {
		// 只计算到秒
		if (times.length() > 10) {
			times = times.substring(0, 10);
		}
		long timeStamp = new Long(times);
		LocalDateTime dateTime = LocalDateTime.ofEpochSecond(timeStamp, 0, ZoneOffset.ofHours(8));
        String year = dateTime.format(YEAR);
		String month = dateTime.format(MONTH);
		String day = dateTime.format(DAY);
		String hour = dateTime.format(HOUR);
		String minute = dateTime.format(MINUTE);
		String second = dateTime.format(SECOND);
		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) {
		return getDateString(date.getTime() + "", 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;
	}
	
    /**
     * 将java.util.Date 转换为java8 的java.time.LocalDateTime,默认时区为东8区
     * 
     * @param date
     * @return
     */
    public static LocalDateTime dateToLocalDateTime(Date date) {
        return date.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime();
    }
 
    /**
     * 将java8 的 java.time.LocalDateTime 转换为 java.util.Date,默认时区为东8区
     * 
     * @param localDateTime
     * @return
     */
    public static Date localDateTimeToDate(LocalDateTime localDateTime) {
        return Date.from(localDateTime.toInstant(ZoneOffset.of("+8")));
    }
	
	/**
	 * 获取DateTimeFormatter的日期
	 * 
	 * @param date 传入的日期
	 * @param format 自定义格式,例:yyyy-MM-dd
	 * @return
	 */
	public static String getDateTimeFormatter(Date date,String format) {
		DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(format);
		LocalDateTime ldt = dateToLocalDateTime(date);
		return ldt.format(dateFormat);
	}
	
	/**
	 * 日期比较
	 * 
	 * @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 (startDate == null || endDate == null) {
			return null;
		}
		int r = 0;
		if (getSecond(startDate) > getSecond(endDate)) {
			r = 1;
		}
		if (getSecond(startDate) < getSecond(endDate)) {
			r = -1;
		}
		return r;
	}

	/**
	 * 校验日期是否合法,校验格式:yyyy-MM-dd
	 * 
	 * @param date 日期字符串
	 * @return
	 */
	public static boolean isValidDate(String date) {
		try {
			YEAR_MONTH_DAY.parse(date);
			return true;
		} catch (DateTimeParseException e) {
			// 如果throw,就说明格式不对
			return false;
		}
	}
	
	/**
	 * 校验日期是否合法,
	 * 
	 * @param date 日期字符串
	 * @param formatter 校验格式,例:yyyy-MM-dd
	 * @return
	 */
	public static boolean isValidDateFormat(String date, String formatter) {
		DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern(formatter);
	    try {
	    	dateFormat.parse(date);
	        return true;
	    } catch (DateTimeParseException e) {
	    	// 如果throw,就说明格式不对
	        return false;
	    }
	}
	
	/**
	 * 格式为yyyy-MM-dd的时间字符串转为秒,默认时区为东8区
	 * 
	 * @param dateStr
	 * @return
	 */
	public static long getSecond(String dateStr) {
		return LocalDateTime.parse(dateStr + " 00:00:00", DATE).toEpochSecond(ZoneOffset.of("+8"));
	}
	
	/**
	 * 时间相减得到年份,不够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) (((getSecond(startDate) - getSecond(endDate)) / (60 * 60 * 24)) / 365);
			return years;
		} catch (Exception e) {
			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) (getSecond(startDate) - getSecond(endDate)) / (24 * 60 * 60);
        	return days;
		} catch (Exception e) {
			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 getDateTimeFormatter(date, "yyyy-MM-dd HH:mm:ss");
    }
    
    /**
     * 得到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();
        return getDateTimeFormatter(date, "E");
    }

}


测试类:

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.getDateTimeFormatter(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/103378730