工具类:
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));
}
}