package union.com.viewgroup;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.regex.Pattern;
/*
* @Auther xiaobo
* @Date 2019/8/13 9:28
* @Version 1.0
* @Desc 时间格式处理工具类
*/
public class DateUtils {
private static Calendar calendar = Calendar.getInstance(new Locale("zh"));
private static DateFormat sdf;
// 匹配 yyyy-MM-dd
private static String regxY1 = "[1-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-[0-9][0-9]";
// 匹配 yyyy:MM:dd hh:mm:ss
private static String regxY3 = "[1-9][0-9][0-9][0-9]:(0[1-9]|1[0-2]):[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]";
// 匹配 yyyy-MM-dd hh:mm:ss
private static String regxY4 = "[1-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]";
// 匹配 yyyy-MM-dd hh:mm
private static String regxY6 = "[1-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-[0-9][0-9] [0-9][0-9]:[0-9][0-9]";
private final static long minute = 60 * 1000;// 1分钟
private final static long hour = 60 * minute;// 1小时
private final static long day = 24 * hour;// 1天
private final static long month = 31 * day;// 月
private final static long year = 12 * month;// 年
/**
* @param day 推迟的天数
* @param pattern 格式
* @return 获取当前向后推迟 n 天的日期
*/
public static String getCurrentDateAfterAddDayFormat(int day, String pattern) {
sdf = new SimpleDateFormat(pattern);
return sdf.format(getCurentDateFormatAfterAddDay(day));
}
/**
* @param day 推迟的天数
* @param pattern 格式
* @return 获取当前向前推迟 n 天的日期
*/
public static String getCurrentDateBeforeDayFormat(int day, String pattern) {
sdf = new SimpleDateFormat(pattern);
return sdf.format(getCurentDateFormatBeforeDay(day));
}
/**
* @param pattern 返回昨天之前 pattern 的格式日期
* @return 获取 “今天 00:00 、昨天 00:00 pattern 格式的日期 ”
*/
public static String getFormTime(String pattern) {
Calendar inputTime = Calendar.getInstance();
calendar.setTime(new Date());
calendar.clear(Calendar.MINUTE);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.SECOND);
inputTime.setTimeInMillis(System.currentTimeMillis());
if (calendar.before(inputTime)) {
return "今天";
} else {
calendar.set(Calendar.DAY_OF_MONTH, -1);
if (calendar.before(inputTime)) {
return "昨天";
}
}
return getCurrentDateFormat(pattern);
}
/**
* @param pattern 返回昨天之前 pattern 的格式日期
* @return 获取 “今天 00:00 、昨天 00:00 pattern 格式的日期 ”
*/
public static String getFormTimeInputFormat(String inputTimeStr) {
String pattern = "yyyy-MM-dd";
try {
pattern = paseDate(inputTimeStr, returnFormat(inputTimeStr));
Calendar inputTime = Calendar.getInstance();
DateFormat format = getSDFFormat(inputTimeStr);
Date date = getData(format, inputTimeStr);
calendar.setTime(new Date());
calendar.clear(Calendar.MINUTE);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.clear(Calendar.SECOND);
inputTime.setTimeInMillis(date.getTime());
if (calendar.before(inputTime)) {
return "今天";
} else {
calendar.set(Calendar.DAY_OF_MONTH, -1);
if (calendar.before(inputTime)) {
return "昨天";
}
}
return getCurrentDateFormat(pattern);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
return getCurrentDateFormat(pattern);
}
/**
* @param pattern 时间样式
* @return 获取时间format 样式
*/
public static String getCurrentDateFormat(String pattern) {
sdf = new SimpleDateFormat(pattern);
return sdf.format(getCurentDate());
}
/**
* @param date 要格式的日期
* @param pattern 输出的格式
* @return 格式化输入格式
*/
public static String getFormatInputTime(Date date, String pattern) {
sdf = new SimpleDateFormat(pattern);
return sdf.format(date);
}
/**
* @param inputTime 输入时间
* @param pattern 输入的格式
* @return 转换输入的时间为期望的输入格式
*/
public static String paseDate(String inputTime, String pattern) {
try {
sdf = getSDFFormat(inputTime);
Date data = getData(sdf, inputTime);
return getFormatInputTime(data, pattern);
} catch (ParseException e) {
e.printStackTrace();
throw new IllegalArgumentException("参数非法");
}
}
/**
* 获取输入格式的 Data
*
* @param inputTime
* @return
* @throws ParseException
*/
private static Date getData(DateFormat df, String inputTime) throws ParseException {
return df.parse(inputTime);
}
/**
* 根据inputTime 获取对应格式的SimpleDateFormat
*
* @param inputTime 输入的时间
*/
private static DateFormat getSDFFormat(String inputTime) {
if (isMatchInput(regxY1, inputTime)) {
sdf = new SimpleDateFormat("yyyy-MM-dd");
} else if (isMatchInput(regxY3, inputTime)) {
sdf = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss");
} else if (isMatchInput(regxY4, inputTime)) {
sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
} else if (isMatchInput(regxY6, inputTime)) {
sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
}
return sdf;
}
/**
* 返回输入时间的格式
*
* @param inputTime 输入时间
* @return 解析格式
* @throws IllegalAccessException
*/
private static String returnFormat(String inputTime) throws IllegalAccessException {
if (isMatchInput(regxY1, inputTime)) {
return "yyyy-MM-dd";
} else if (isMatchInput(regxY3, inputTime)) {
return "yyyy:MM:dd hh:mm:ss";
} else if (isMatchInput(regxY4, inputTime)) {
return "yyyy-MM-dd hh:mm:ss";
} else if (isMatchInput(regxY6, inputTime)) {
return "yyyy-MM-dd hh:mm";
} else {
throw new IllegalAccessException("格式不识别");
}
}
//-------------------------------分割线-------------------------
/**
* 时间格式是否匹配
*
* @param regex 匹配表达式
* @param inputDate 输入格式
* @return 匹配结果
*/
private static boolean isMatchInput(String regex, String inputDate) {
boolean isMatch = Pattern.matches(regex, inputDate);
return isMatch;
}
/**
* @return 获取当前时间Date
*/
private static Date getCurentDate() {
calendar.setTime(new Date());
return calendar.getTime();
}
/**
* 当前日期向后推迟 day 天
*
* @param day 推迟的天数
* @return
*/
private static Date getCurentDateFormatAfterAddDay(int day) {
calendar.setTime(new Date());
calendar.add(Calendar.DATE, day);
return calendar.getTime();
}
/**
* 当前日期向前推迟 day 天
*
* @param day 推迟的天数
* @return
*/
private static Date getCurentDateFormatBeforeDay(int day) {
calendar.setTime(new Date());
calendar.add(Calendar.DATE, -day);
return calendar.getTime();
}
/**
* 具体分钟之前
* @param date 日期
* @return 具体格式化
*/
public static String getTimeFormatText(Date date) {
if (date == null) {
return null;
}
long diff = new Date().getTime() - date.getTime();
long r = 0;
if (diff > year) {
r = (diff / year);
return r + "年前";
}
if (diff > month) {
r = (diff / month);
return r + "个月前";
}
if (diff > day) {
r = (diff / day);
return r + "天前";
}
if (diff > hour) {
r = (diff / hour);
return r + "个小时前";
}
if (diff > minute) {
r = (diff / minute);
return r + "分钟前";
}
return "刚刚";
}
/**
* 具体分钟之前
* @param date 日期
* @return 具体格式化
*/
public static String getTimeFormatText(String inputTime) {
try{
DateFormat sdf = getSDFFormat(inputTime);
Date date = getData(sdf, inputTime);
if (date == null) {
return null;
}
long diff = new Date().getTime() - date.getTime();
long r = 0;
if (diff > year) {
r = (diff / year);
return r + "年前";
}
if (diff > month) {
r = (diff / month);
return r + "个月前";
}
if (diff > day) {
r = (diff / day);
return r + "天前";
}
if (diff > hour) {
r = (diff / hour);
return r + "个小时前";
}
if (diff > minute) {
r = (diff / minute);
return r + "分钟前";
}
return "刚刚";
}catch (Exception e){
return "inputTime";
}
}
/**
* 处理分钟显示
*
* @param inputTime 输入时间
* @param during 分钟间隔
* @return 返回处理结果
*/
public static String getMin(String inputTime, int during) {
try {
Calendar currentTimeCalenDar = Calendar.getInstance();
currentTimeCalenDar.setTime(new Date());
DateFormat sdf = getSDFFormat(inputTime);
calendar.setTime(getData(sdf, inputTime));
calendar.get(Calendar.MINUTE);
if (currentTimeCalenDar.get(Calendar.YEAR) - calendar.get(Calendar.YEAR) == 0 &&
currentTimeCalenDar.get(Calendar.MONTH) - calendar.get(Calendar.MONTH) == 0
&& currentTimeCalenDar.get(Calendar.DATE) - calendar.get(Calendar.DATE) == 0
) {
//2019-08-12 17:30:20
if (currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE) > during) {
if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) < 0) {
return currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) + "分钟前";
} else {
if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
return getFormTimeInputFormat(inputTime);
} else {
return during + "分钟前";
}
}
} else {
if (currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE) < 0) {
if (((currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE)) + 60) > during) {
if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
return getFormTimeInputFormat(inputTime);
} else {
return during + "分钟前";
}
} else {
if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
return getFormTimeInputFormat(inputTime);
} else {
return ((currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE)) + 60) + "分钟前";
}
}
} else {
if (currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) > 1) {
return getFormTimeInputFormat(inputTime);
} else {
if(currentTimeCalenDar.get(Calendar.HOUR_OF_DAY) - calendar.get(Calendar.HOUR_OF_DAY) == 1){
return getFormTimeInputFormat(inputTime);
}else {
return ((currentTimeCalenDar.get(Calendar.MINUTE) - calendar.get(Calendar.MINUTE))) + "分钟前";
}
}
}
}
} else {
return getFormTimeInputFormat(inputTime);
}
} catch (ParseException e) {
e.printStackTrace();
}
return inputTime;
}
public static void main(String[] args) {
//获取当前向后推迟 n 天的日期
String YYYYMMDD = ("yyyy-MM-dd HH:mm:ss");
System.out.println(getCurrentDateAfterAddDayFormat(1, YYYYMMDD) + "");
System.out.println("----------------------");
System.out.println(getCurrentDateBeforeDayFormat(3, YYYYMMDD) + "");
System.out.println("----------------------");
System.out.println(getFormTime(YYYYMMDD) + "");
System.out.println("----------------------");
System.out.println("匹配yyyy-MM-dd: " + isMatchInput(regxY1, "2018-05-06"));
System.out.println("匹配yyyy:MM:dd: " + isMatchInput(regxY3, "2019:08:12 17:25:30"));
System.out.println("匹配yyyy-MM-dd " + isMatchInput(regxY4, "2019-08-12 17:25:30"));
System.out.println("匹配yyyy-MM-dd " + isMatchInput(regxY6, "2019-08-12 17:25"));
System.out.println("----------------------");
System.out.println(paseDate("2018-05-06 17:25:20", "yyyy-MM-dd"));
System.out.println("----------------------");
String during = getMin("2019-08-12 20:00:20", 60);
System.out.println(during);
System.out.println("----------------------");
String forData = getTimeFormatText("2019-08-12 20:00:20");
System.out.println(forData);
}
}