import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.Date;
/**
* @author 作者 Nemo
*/
public class DateTimeUtils extends DateFormatUtils {
private DateTimeUtils() {}
/**
* 英文简写(默认)如:2010-12-01
*/
public final static String FORMAT_SHORT = "yyyy-MM-dd";
/**
* 英文简写(默认)如:20101201
*/
public final static String FORMAT_SHORT_2 = "yyyyMMdd";
/**
* 英文简写(默认)如:201012
*/
public final static String FORMAT_SHORT_3 = "yyyyMM";
/**
* 英文简写(默认)如:2010
*/
public final static String FORMAT_SHORT_4 = "yyyy";
/**
* 英文简写(默认)如:2010
*/
public final static String FORMAT_SHORT_5 = "yyyy/MM/dd";
/**
* 英文全称 如:2010-12-01 23:15:06
*/
public final static String FORMAT_LONG = "yyyy-MM-dd HH:mm:ss";
/**
* 英文全称 如:2010/12/01 23:15:06
*/
public final static String FORMAT_LONG_2 = "yyyy/MM/dd HH:mm:ss";
/**
* 精确到毫秒的完整时间 如:yyyy-MM-dd HH:mm:ss.S
*/
public final static String FORMAT_FULL = "yyyy-MM-dd HH:mm:ss.S";
/**
* 中文简写 如:2010年12月01日
*/
public final static String FORMAT_SHORT_CN = "yyyy年MM月dd日";
/**
* 中文全称 如:2010年12月01日 23时15分06秒
*/
public final static String FORMAT_LONG_CN = "yyyy年MM月dd日 HH时mm分ss秒";
/**
* 精确到毫秒的完整中文时间
*/
public final static String FORMAT_FULL_CN = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒";
/**
* cron 表达式
*/
public final static String FORMAT_CRON = "* m H * * ?";
/**
* 格式化时间
*/
public final static String FORMAT_HOUR_MINUTE="HH:mm";
/**
* 获得默认的 date pattern
*/
public static String getDatePattern() {
return FORMAT_LONG;
}
/**
* 根据预设格式返回当前日期
*
* @return
*/
public static String getNow() {
return format(new Date());
}
/**
* 根据用户格式返回当前日期
*
* @param format
* @return
*/
public static String getNow(String format) {
return format(new Date(), format);
}
/**
* 当前时间
*
* @return
*/
public static Date getNowDate() {
return new Date();
}
/**
* 根据当前日期构建6个月日期
*
* @param monthLen 多个月份
* @param format 格式
* @param isExtend 生成规则,前还是后, true 前
* @return
*/
public static String[] generateFormBeforMonths(int monthLen, String format, boolean isExtend, Date nowDate) {
String[] beforMonth = new String[monthLen];
for (int i = 0; i < monthLen; i++) {
int monthParam;
if (isExtend) { // 往前
monthParam = i == 0 ? -1 : (i + (-1));
} else {
monthParam = -i;
}
Date addMonth = DateTimeUtils.addMonth(nowDate, monthParam);
beforMonth[i] = DateTimeUtils.format(addMonth, format);
}
return beforMonth;
}
/**
* 使用预设格式格式化日期
* @param date
* @return yyyy-MM-dd HH:mm:ss
*/
public static String format(Date date) {
return format(date, getDatePattern());
}
/**
* 格式化日期
* @param date
* @return yyyy-MM-dd
*/
public static String formatYMD(Date date) {
return format(date, FORMAT_SHORT);
}
public static String formatYMD2(Date date) {
return format(date, FORMAT_SHORT_2);
}
public static String formatYMD5(Date date) {
return format(date, FORMAT_SHORT_5);
}
/**
* 使用用户格式格式化日期
*
* @param date 日期
* @param pattern 日期格式
* @return
*/
public static String format(Date date, String pattern) {
String returnValue = "";
if (date != null) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
returnValue = df.format(date);
}
return returnValue;
}
/**
* 使用预设格式提取字符串日期
*
* @param strDate 日期字符串
* @return
*/
public static Date parse(String strDate) {
return parse(strDate, getDatePattern());
}
public static Date parseYMD(String strDate){
return parse(strDate, FORMAT_SHORT);
}
/**
* 使用用户格式提取字符串日期
*
* @param strDate 日期字符串
* @param pattern 日期格式
* @return
*/
public static Date parse(String strDate, String pattern) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
try {
return df.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
return null;
}
}
/**
* @Description: 截断日期,精确到日,去掉时分秒。
* @param date
* @return date
*/
public static Date truncateDateYMD(Date date){
// Calendar instance = Calendar.getInstance();
// instance.setTime(date);
//
// instance.set(Calendar.HOUR_OF_DAY, 0);
// instance.set(Calendar.SECOND, 0);
// instance.set(Calendar.MINUTE, 0);
// return instance.getTime();
return DateUtils.truncate(date, Calendar.DATE);
}
public static Date parseLocalDate(String str) {
LocalDate parse = LocalDate.parse(str, DateTimeFormatter.BASIC_ISO_DATE);
Calendar instance = Calendar.getInstance();
instance.set(instance.YEAR, parse.getYear());
instance.set(instance.MONDAY, parse.getMonthValue());
return instance.getTime();
}
/**
* 在日期上增加数个整月
*
* @param date 日期
* @param n 要增加的月数
* @return
*/
public static Date addMonth(Date date, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.MONTH, n);
return cal.getTime();
}
/**
* 在日期上增加数个年
*
* @param date 日期
* @param n 要增加的年
* @return
*/
public static Date addYear(Date date, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.YEAR, n);
return cal.getTime();
}
/**
* 在日期上增加天数
*
* @param date 日期
* @param n 要增加的天数
* @return
*/
public static Date addDay(Date date, int n) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, n);
return cal.getTime();
}
/**
* 在日期上增加 分钟
*
* @param date 日期
* @param minute 分钟
* @return
*/
public static Date getDateAddMinute(Date date, int minute) {
Calendar cl = Calendar.getInstance();
cl.setTime(date);
cl.add(Calendar.MINUTE, minute);
return cl.getTime();
}
/**
* 获取时间戳
*/
public static String getTimeString() {
SimpleDateFormat df = new SimpleDateFormat(FORMAT_FULL);
Calendar calendar = Calendar.getInstance();
return df.format(calendar.getTime());
}
/**
* 获取日期年份
*
* @param date 日期
* @return
*/
public static String getYear(Date date) {
return format(date).substring(0, 4);
}
/**
* 返回当前时间年份值
*
* @return
*/
public static int getThisYear() {
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
int year = calendar.get(Calendar.YEAR);
return year;
}
/**
* 按默认格式的字符串距离今天的天数
*
* @param date 日期字符串
* @return
*/
public static int countDays(String date) {
long t = Calendar.getInstance().getTime().getTime();
Calendar c = Calendar.getInstance();
c.setTime(parse(date));
long t1 = c.getTime().getTime();
return (int) (t / 1000 - t1 / 1000) / 3600 / 24;
}
/**
*计算两日期之间的天数。
* 当beginDate 小于 endDate时,正数,
* 当beginDate 等于 endDate时,0,
* 当beginDate 大于 endDate时,负数,
* @param beginDate 2017-03-10
* @param endDate 2017-03-12
* @return 返回2天
*/
public static int countDays(Date beginDate,Date endDate) {
Calendar c = Calendar.getInstance();
c.setTime(endDate);
long t = c.getTime().getTime();
Calendar c1 = Calendar.getInstance();
c1.setTime(beginDate);
long t1 = c1.getTime().getTime();
return (int) (t / 1000 - t1 / 1000) / 3600 / 24;
}
/**
*计算两日期之间的月份数
* 当beginDate<endDate时,正数,
* 当beginDate=endDate时,0,
* 当beginDate>endDate时,负数,
* @param beginDate 2017-03
* @param endDate 2017-04
* @return 返回1个月
*/
public static int countMonths(Date beginDate, Date endDate) {
Calendar c = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c.setTime(beginDate);
c2.setTime(endDate);
int year = c.get(Calendar.YEAR);
int month = c.get(Calendar.MONTH);
int year2 = c2.get(Calendar.YEAR);
int month2 = c2.get(Calendar.MONTH);
int result = 0;
if (year == year2) {
result = month2 - month;// 两个日期相差几个月,即月份差
} else {
result = 12 * (year2 - year) + month2 - month;// 两个日期相差几个月,即月份差
}
return result;
}
/**
* 按用户格式字符串距离今天的天数
*
* @param date 日期字符串
* @param format 日期格式
* @return
*/
public static int countDays(String date, String format) {
long t = Calendar.getInstance().getTime().getTime();
Calendar c = Calendar.getInstance();
c.setTime(parse(date, format));
long t1 = c.getTime().getTime();
return (int) (t / 1000 - t1 / 1000) / 3600 / 24;
}
/**
* 获取每月最后一天时间
*
* @param sDate1
* @return
*/
public static Date getLastDayOfMonth(Date sDate1) {
Calendar cDay1 = Calendar.getInstance();
cDay1.setTime(sDate1);
final int lastDay = cDay1.getActualMaximum(Calendar.DAY_OF_MONTH);
Date lastDate = cDay1.getTime();
lastDate.setDate(lastDay);
return lastDate;
}
/**
* 获取下一个月第一天凌晨1点
*/
public static Date nextMonthFirstDate() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY,