import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.springframework.util.StringUtils;
import tv.zhongchi.common.exception.BizException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
/**
* @ClassName DateUtil
* @Author ZhangRF
* @CreateDate 2020/6/12
* @Decription 时间工具类
*/
public class DateUtil {
public static final long ONE_HOUR_TIME_LONG = 3600000;
/**
* 年(yyyy)
*/
public static final String YEAR = "yyyy";
/**
* 年-月(yyyy-MM)
*/
public static final String YEAR_MONTH = "yyyy-MM";
/**
* 年-月-日(yyyy-MM-dd)
*/
public static final String YEAR_MONTH_DAY = "yyyy-MM-dd";
/**
* 年月日(yyyyMMdd)
*/
public static final String YEAR_MONTH_DAY_SIMPLE = "yyyyMMdd";
/**
* 年-月-日 小时(yyyy-MM-dd HH)
*/
public static final String YEAR_MONTH_DAY_HOUR = "yyyy-MM-dd HH";
/**
* 年-月-日 小时(yyyy-MM-dd HH)中文输出
*/
public static final String YEAR_MONTH_DAY_HOUR_CN = "yyyy年MM月dd日HH时";
/**
* 年-月-日 小时:分钟(yyyy-MM-dd HH:mm)
*/
public static final String YEAR_MONTH_DAY_HOUR_MINUTE = "yyyy-MM-dd HH:mm";
/**
* 年-月-日 小时:分钟:秒钟(yyyy-MM-dd HH:mm:ss)
*/
public static final String YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
/**
* 年月日小时分钟(yyMMddHHmm)订单
*/
public static final String YEAR_MONTH_DAY_HOUR_MINUTE_ORDER = "yyMMddHHmm";
/**
* 年月日小时分钟秒钟(yyyyMMddHHmmss)
*/
public static final String YEAR_MONTH_DAY_HOUR_MINUTE_SECOND_SIMPLE = "yyyyMMddHHmmss";
/**
* 小时:分钟:秒钟(HH:mm:ss)
*/
public static final String HOUR_MINUTE_SECOND = "HH:mm:ss";
/**
* 小时:分钟(HH:mm)
*/
public static final String HOUR_MINUTE = "HH:mm";
/**
* 月.日(M.d)
*/
public static final String MONTH_DAY = "M.d";
public static final String REG_EXP_DATE = "^((([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29))\\s+([0-1]?[0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
/**
* 一天的秒数
*/
private static final int DAY_SECOND = 24 * 60 * 60;
/**
* 一小时的秒数
*/
private static final int HOUR_SECOND = 60 * 60;
/**
* 一分钟的秒数
*/
private static final int MINUTE_SECOND = 60;
public DateUtil() {
System.setProperty("user.timezone", "Asia/Shanghai");
}
/**
* 获取当前时间
*
* @return 返回当前时间
*/
public static Date getCurrent() {
return new Date();
}
/**
* 获取当前时间并格式化
*
* @return 返回当前时间
*/
public static String getCurrentDate(String format) {
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(d);
}
/**
* 获取下个月时间并格式化
*
* @return 返回当前时间
*/
public static String getNextDate(String format) {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
SimpleDateFormat dft = new SimpleDateFormat(format);
String preMonth = dft.format(cal.getTime());
return preMonth;
}
/**
* 格式化日期时间
*
* @param date Date对象
* @param pattern 模式
* @return 格式化后的日期时间字符串
*/
public static String format(Date date, String pattern) {
if (date == null)
return "";
return new DateTime(date).toString(pattern);
}
/**
* 格式化日期时间字符串
*
* @param dateString 日期时间字符串
* @param pattern 模式
* @return Date对象
*/
public static Date formatDateString(String dateString, String pattern) {
try {
DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(pattern);
return dateTimeFormatter.parseDateTime(dateString).toDate();
} catch (Exception e) {
return null;
}
}
/**
* 根据秒数获得x天x小时x分钟x秒字符串
*
* @param second 秒数
* @return x天x小时x分钟x秒字符串
*/
public static String getDayHourMinuteSecond(int second) {
if (second == 0) {
return "0秒";
}
StringBuilder sb = new StringBuilder();
int days = second / DAY_SECOND;
if (days > 0) {
sb.append(days);
sb.append("天");
second -= days * DAY_SECOND;
}
int hours = second / HOUR_SECOND;
if (hours > 0) {
sb.append(hours);
sb.append("小时");
second -= hours * HOUR_SECOND;
}
int minutes = second / MINUTE_SECOND;
if (minutes > 0) {
sb.append(minutes);
sb.append("分钟");
second -= minutes * MINUTE_SECOND;
}
if (second > 0) {
sb.append(second);
sb.append("秒");
}
return sb.toString();
}
/**
* 根据秒数获得x天x小时x分钟字符串
*
* @param second 秒数
* @return x天x小时x分钟字符串
*/
public static String getDayHourMinute(int second) {
if (second == 0) {
return "0分钟";
}
StringBuilder sb = new StringBuilder();
int days = second / DAY_SECOND;
if (days > 0) {
sb.append(days);
sb.append("天");
second -= days * DAY_SECOND;
}
int hours = second / HOUR_SECOND;
if (hours > 0) {
sb.append(hours);
sb.append("小时");
second -= hours * HOUR_SECOND;
}
int minutes = second / MINUTE_SECOND;
if (minutes > 0) {
sb.append(minutes);
sb.append("分钟");
}
return sb.toString();
}
/**
* 获取只含有年月日的DateTime对象
*
* @param dateTime DateTime对象
* @return 只含有年月日的DateTime对象
*/
public static DateTime getDateOnly(DateTime dateTime) {
return new DateTime(dateTime.toString(YEAR_MONTH_DAY));
}
/**
* 获取当前周的周一和下周一
*
* @return 日期数组(索引0为周一,索引1为下周一)
*/
public static Date[] getMondayAndNextMonday() {
DateTime dateTime = getDateOnly(new DateTime());
DateTime monday = dateTime.dayOfWeek().withMinimumValue();
DateTime nextMonday = monday.plusDays(7);
return new Date[]{monday.toDate(), nextMonday.toDate()};
}
/**
* 获取指定时间的周一和周日
*
* @param dateTime DateTime对象
* @return 日期数组(索引0为周一,索引1为周日)
*/
public static Date[] getMondayAndSunday(DateTime dateTime) {
dateTime = getDateOnly(dateTime);
DateTime monday = dateTime.dayOfWeek().withMinimumValue();
DateTime sunday = monday.plusDays(6);
return new Date[]{monday.toDate(), sunday.toDate()};
}
/**
* 和今天相比的天数差(正数为大于天数,负数为小于天数,零为同一天)
*
* @param date Date对象
* @return 和今天相比的天数差
*/
public static int compareDaysWithToday(Date date) {
DateTime today = new DateTime();
today = new DateTime(today.getYear(), today.getMonthOfYear(), today.getDayOfMonth(), 0, 0, 0, 0);
DateTime compareDay = new DateTime(date);
compareDay = new DateTime(compareDay.getYear(), compareDay.getMonthOfYear(), compareDay.getDayOfMonth(), 0, 0, 0, 0);
return Days.daysBetween(today, compareDay).getDays();
}
/**
* 比较时间a到时间b的天数差
*
* @param a 时间a
* @param b 时间b
* @return 相差天数
*/
public static int compareDaysWithDay(Date a, Date b) {
DateTime today = new DateTime(b);
today = new DateTime(today.getYear(), today.getMonthOfYear(), today.getDayOfMonth(), 0, 0, 0, 0);
DateTime compareDay = new DateTime(a);
compareDay = new DateTime(compareDay.getYear(), compareDay.getMonthOfYear(), compareDay.getDayOfMonth(), 0, 0, 0, 0);
return Days.daysBetween(today, compareDay).getDays();
}
/**
* 比较两个时间是否相等(省略毫秒)
*
* @param date Date对象
* @param compareDate 比较Date对象
* @return 是否相等
*/
public static boolean compareDateIgnoreMillisecond(Date date, Date compareDate) {
if (date == null && compareDate == null) {
return true;
} else if (date == null && compareDate != null) {
return false;
} else if (date != null && compareDate == null) {
return false;
}
return (date.getTime() / 1000 == compareDate.getTime() / 1000);
}
/**
* 根据秒数获取天数
*
* @param second 秒数
* @return 天数
*/
public static int getDay(int second) {
return second / DAY_SECOND;
}
/**
* 获取和今天相比的日期字符串
*
* @param date Date对象
* @return 和今天相比的日期字符串
*/
public static String getCompareWithTodayDateString(Date date) {
int days = Math.abs(DateUtil.compareDaysWithToday(date));
String dateString = "";
if (days == 0) {
dateString = "今天";
} else if (days == 1) {
dateString = "昨天";
} else if (days == 2) {
dateString = "2天前";
} else if (days == 3) {
dateString = "3天前";
} else if (days == 4) {
dateString = "4天前";
} else if (days == 5) {
dateString = "5天前";
} else if (days == 6) {
dateString = "6天前";
} else if (days > 6 && days <= 14) {
dateString = "1周前";
} else if (days > 14 && days <= 21) {
dateString = "2周前";
} else if (days > 21 && days <= 30) {
dateString = "3周前";
} else if (days > 30) {
dateString = "1月前";
} else if (days > 365) {
dateString = "1年前";
} else if (days > 365 * 3) {
dateString = "3年前";
}
return dateString;
}
/**
* 比较两个时间相差分钟数
*
* @param now 当前时间
* @param compareDate 比较时间
* @return 相差分钟数
*/
public static int compareMinutes(Date now, Date compareDate) {
return (int) (now.getTime() - compareDate.getTime()) / 60000;
}
/**
* 比较时间是本月的第几天
*
* @param date
* @return
*/
public static int getDayOfMonth(Date date) {
DateTime dateTime = new DateTime(date);
return dateTime.getDayOfMonth();
}
/**
* 计算今天是今年第几天
*
* @return
*/
public static Integer todayYearDayNum() {
return -compareDaysWithToday(parse(year(new Date()) - 1 + "-12-31"));
}
/**
* 计算当月有几天
*
* @param date
* @return
*/
public static int getDateOfMonth(Date date) {
DateTime dateTime = new DateTime(date);
return dateTime.dayOfMonth().getMaximumValue();
}
/**
* 指定时间,判断该时间到现在时间的年数
*
* @param date 指定时间
* @return 到现在时间的年数
*/
public static int compareYear(Date date) {
DateTime btd = new DateTime(date);
DateTime nowDate = new DateTime();
int year = 0;
if (nowDate.getMonthOfYear() > btd.getMonthOfYear()) {
year = nowDate.getYear() - btd.getYear();
} else if (nowDate.getMonthOfYear() < btd.getMonthOfYear()) {
year = nowDate.getYear() - btd.getYear() - 1;
} else if (nowDate.getMonthOfYear() == btd.getMonthOfYear()) {
if (nowDate.getDayOfMonth() >= btd.getDayOfMonth()) {
year = nowDate.getYear() - btd.getYear();
} else {
year = nowDate.getYear() - btd.getYear() - 1;
}
}
return year;
}
/**
* 获取两个日期相差的月数
*/
public static int getMonthDiff(Date d1, Date d2) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(d1);
c2.setTime(d2);
int year1 = c1.get(Calendar.YEAR);
int year2 = c2.get(Calendar.YEAR);
int month1 = c1.get(Calendar.MONTH);
int month2 = c2.get(Calendar.MONTH);
int day1 = c1.get(Calendar.DAY_OF_MONTH);
int day2 = c2.get(Calendar.DAY_OF_MONTH);
// 获取年的差值
int yearInterval = year1 - year2;
// 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数
if (month1 < month2 || month1 == month2 && day1 < day2) {
yearInterval--;
}
// 获取月数差值
int monthInterval = (month1 + 12) - month2;
if (day1 < day2) {
monthInterval--;
}
monthInterval %= 12;
int monthsDiff = Math.abs(yearInterval * 12 + monthInterval);
return monthsDiff;
}
/**
* 两指定时间之间的年份
*
* @param startDate
* @param endDate
* @return
*/
public static int compareYear(Date startDate, Date endDate) {
DateTime btd = new DateTime(startDate);
DateTime nowDate = new DateTime(endDate);
int year = 0;
if (nowDate.getMonthOfYear() > btd.getMonthOfYear()) {
year = nowDate.getYear() - btd.getYear();
} else if (nowDate.getMonthOfYear() < btd.getMonthOfYear()) {
year = nowDate.getYear() - btd.getYear() - 1;
} else if (nowDate.getMonthOfYear() == btd.getMonthOfYear()) {
if (nowDate.getDayOfMonth() >= btd.getDayOfMonth()) {
year = nowDate.getYear() - btd.getYear();
} else {
year = nowDate.getYear() - btd.getYear() - 1;
}
}
return year;
}
/**
* 判断2个时间的时间差 返回字符串形式
*
* @param date 要对比的字符串
* @param date2 要对比的字符串
* @return 字符串形式 如1小时 ,2天2小时
*/
public static String compareDaysWithDate(Date date, Date date2) {
StringBuilder msg = new StringBuilder();
int minutes = (int) Math.abs((date.getTime() - date2.getTime()) / 60000);
if (minutes / 60 > 0 && minutes / 60 / 24 <= 0) {
msg.append(minutes / 60 + "小时");
}
if (minutes / 60 / 24 > 0) {
msg.append(minutes / 60 / 24 + "天");
msg.append(minutes / 60 % 24 + "小时");
}
return msg.toString();
}
/**
* 自动解析多种格式的时间字符串为时间对象<br>
* 支持格式为:yyyy-MM-dd HH:mm:ss 支持多种分隔符,以及多种日期精度。 如yyyy年MM月。 HH时mm分ss秒
*
* @param dateString 时间字符串 <br>
* @return 格式正确则返回对应的java.util.Date对象 格式错误返回null
*/
public static Date formatUnknownString2Date(String dateString) {
try {
if (StringUtil.isEmpty(dateString)) {
return null;
}
dateString = dateString.replace("T", " ");
String hms = "00:00:00";
dateString = dateString.trim();
if (dateString.contains(" ")) {
// 截取时分秒
hms = dateString.substring(dateString.indexOf(" ") + 1);
// 重置日期
dateString = dateString.substring(0, dateString.indexOf(" "));
// 多中分隔符的支持
hms = hms.replace(":", ":");
hms = hms.replace("时", ":");
hms = hms.replace("分", ":");
hms = hms.replace("秒", ":");
hms = hms.replace("-", ":");
hms = hms.replace("-", ":");
// 时间不同精确度的支持
if (hms.endsWith(":")) {
hms = hms.substring(0, hms.length() - 1);
}
if (hms.split(":").length == 1) {
hms += ":00:00";
}
if (hms.split(":").length == 2) {
hms += ":00";
}
}
String[] hmsarr = hms.split(":");
// 不同日期分隔符的支持
dateString = dateString.replace(".", "-");
dateString = dateString.replace("/", "-");
dateString = dateString.replace("-", "-");
dateString = dateString.replace("年", "-");
dateString = dateString.replace("月", "-");
dateString = dateString.replace("日", "");
// 切割年月日
String yearStr, monthStr, dateStr;
// 截取日期
String[] ymd = dateString.split("-");
// 判断日期精确度
yearStr = ymd[0];
monthStr = ymd.length > 1 ? ymd[1] : "";
dateStr = ymd.length > 2 ? ymd[2] : "";
monthStr = monthStr == "" ? Integer.toString(1) : monthStr;
if (monthStr.length() == 1) {
monthStr = 0 + monthStr;
}
dateStr = dateStr == "" ? Integer.toString(1) : dateStr;
if (dateStr.length() == 1) {
dateStr = 0 + dateStr;
}
String dtr = (yearStr + "-" + monthStr + "-" + dateStr + " " + hms);
if (!dtr.matches(REG_EXP_DATE))
return null;
// 返回日期
return new DateTime(Integer.parseInt(yearStr.trim()), Integer.parseInt(monthStr.trim()), Integer.parseInt(dateStr.trim()), Integer.parseInt(hmsarr[0].trim()), Integer.parseInt(hmsarr[1].trim()), Integer.parseInt(hmsarr[2].trim()), 0).toDate();
} catch (Exception e) {
return null;
}
}
/**
* 解析多个时间,指定时间之间的分隔符和时间的格式符 分隔符不能与格式符相同
*
* @param dateString 传入一个时间段字符串
* @param spaceChar 指定格式符
* @param splitChar 指定分隔符
* @return 格式正确返回分割后的时间对象数组 格式错误返回null <br>
* 指定了格式符为. 分隔符为- 返回值为 时间长度为2的Date类型数组<br>
* 时间转换的方式详见 {@link DateTimeUtils#formatUnknownString2Date(String dateString)}
*/
public static Date[] formatDatesByString(String dateString, String spaceChar, String splitChar) {
if (spaceChar.equals(splitChar)) {
return null;
}
String[] dateStrs = dateString.split(splitChar);
Date[] dates = new Date[dateStrs.length];
for (int i = 0, size = dateStrs.length; i < size; i++) {
dates[i] = formatUnknownString2Date(dateStrs[i]);
}
return dates;
}
/**
* 身份证号转生日
*
* @param identityCard 身份证
* @return 生日
*/
public static Date identityCard2Date(String identityCard) {
try {
String dateStr;
if (identityCard.length() == 18) {
dateStr = identityCard.substring(6, 14);// 截取18位身份证身份证中生日部分
return formatDateString(dateStr, "yyyyMMdd");
}
if (identityCard.length() == 15) {
dateStr = identityCard.substring(6, 12);// 截取15位身份证中生日部分
return formatDateString(dateStr, "yyMMdd");
}
return null;
} catch (Exception e) {
return null;
}
}
public static boolean validDate(String str) {
try {
Date date = formatUnknownString2Date(str);
return date != null;
} catch (Exception e) {
return false;
}
}
/**
* 根据周数,获取开始日期、结束日期
*
* @param week 周期 0本周,-1上周,-2上上周,1下周,2下下周
* @return 返回date[0]开始日期、date[1]结束日期
*/
public static Date[] getWeekStartAndEnd(int week) {
DateTime dateTime = new DateTime();
LocalDate date = new LocalDate(dateTime.plusWeeks(week));
date = date.dayOfWeek().withMinimumValue();
Date beginDate = date.toDate();
Date endDate = date.plusDays(6).toDate();
return new Date[]{beginDate, endDate};
}
/**
* 对日期的【秒】进行加/减
*
* @param date 日期
* @param seconds 秒数,负数为减
* @return 加/减几秒后的日期
*/
public static Date addDateSeconds(Date date, int seconds) {
DateTime dateTime = new DateTime(date);
return dateTime.plusSeconds(seconds).toDate();
}
/**
* 对日期的【分钟】进行加/减
*
* @param date 日期
* @param minutes 分钟数,负数为减
* @return 加/减几分钟后的日期
*/
public static Date addDateMinutes(Date date, int minutes) {
DateTime dateTime = new DateTime(date);
return dateTime.plusMinutes(minutes).toDate();
}
/**
* 对日期的【小时】进行加/减
*
* @param date 日期
* @param hours 小时数,负数为减
* @return 加/减几小时后的日期
*/
public static Date addDateHours(Date date, int hours) {
DateTime dateTime = new DateTime(date);
return dateTime.plusHours(hours).toDate();
}
/**
* 对日期的【天】进行加/减
*
* @param date 日期
* @param days 天数,负数为减
* @return 加/减几天后的日期
*/
public static Date addDateDays(Date date, int days) {
DateTime dateTime = new DateTime(date);
return dateTime.plusDays(days).toDate();
}
/**
* 对日期的【周】进行加/减
*
* @param date 日期
* @param weeks 周数,负数为减
* @return 加/减几周后的日期
*/
public static Date addDateWeeks(Date date, int weeks) {
DateTime dateTime = new DateTime(date);
return dateTime.plusWeeks(weeks).toDate();
}
/**
* 对日期的【月】进行加/减
*
* @param date 日期
* @param months 月数,负数为减
* @return 加/减几月后的日期
*/
public static Date addDateMonths(Date date, int months) {
DateTime dateTime = new DateTime(date);
return dateTime.plusMonths(months).toDate();
}
/**
* 对日期的【年】进行加/减
*
* @param date 日期
* @param years 年数,负数为减
* @return 加/减几年后的日期
*/
public static Date addDateYears(Date date, int years) {
DateTime dateTime = new DateTime(date);
return dateTime.plusYears(years).toDate();
}
public static String toString(Date date, String format) {
String dateStr = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
dateStr = sdf.format(date);
} catch (Exception e) {
}
return dateStr;
}
public static Date parseDate(String dateStr, String format) {
Date date = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
date = sdf.parse(dateStr);
} catch (Exception e) {
}
return date;
}
/**
* 获取日期当天的最小时间日期,0点
*/
public static Date getMinTimeDateByDate(Date date) {
if (date == null)
return null;
String datestr = toString(date, "yyyyMMdd");
return parseDate(datestr, "yyyyMMdd");
}
/**
* 获取日期当天的最大时间日期,12点整
*/
public static Date getMaxTimeDateByDate(Date date) {
if (date == null)
return null;
String datestr = toString(date, "yyyyMMdd");
Date d = parseDate(datestr, "yyyyMMdd");
return new Date(d.getTime() + 24L * 60L * 60L * 1000L - 1L);
}
public static long subTime(Date startDate, Date endDate) {
return endDate.getTime() - startDate.getTime();
}
public static long getTime(Date date) {
return date.getTime();
}
/**
* 获取上月第一天最早时间
*
* @return Date
*/
public static Date getLastMonthFirstDay() {
Calendar cal_1 = Calendar.getInstance();// 获取当前日期
cal_1.setTime(getMinTimeDateByDate(new Date()));
cal_1.add(Calendar.MONTH, -1);
cal_1.set(Calendar.DAY_OF_MONTH, 1);
return cal_1.getTime();
}
/**
* 获取上月最后一天最晚时间
*
* @return Date
*/
public static Date getLastMonthLastDay() {
Calendar cale = Calendar.getInstance();
cale.setTime(getMinTimeDateByDate(new Date()));
cale.add(Calendar.MONTH, -1);
cale.set(Calendar.DAY_OF_MONTH, cale.getActualMaximum(Calendar.DAY_OF_MONTH));
return new Date(cale.getTime().getTime() + 1000L * 60L * 60L * 24L - 1L);
}
/**
* 获取本月第一天最早时间
*
* @return Date
*/
public static Date getNowMonthFirstDay() {
Calendar cal_1 = Calendar.getInstance();// 获取当前日期
cal_1.setTime(getMinTimeDateByDate(new Date()));
cal_1.add(Calendar.MONTH, 0);
cal_1.set(Calendar.DAY_OF_MONTH, 1);
return cal_1.getTime();
}
/**
* 获取本月最后一天最晚时间
*
* @return Date
*/
public static Date getNowMonthLastDay() {
Calendar cale = Calendar.getInstance();
cale.setTime(getMinTimeDateByDate(new Date()));
cale.set(Calendar.DAY_OF_MONTH, cale.getActualMaximum(Calendar.DAY_OF_MONTH));
return new Date(cale.getTime().getTime() + 1000L * 60L * 60L * 24L - 1L);
}
/**
* 获取月最后一天最晚时间
*
* @return Date
*/
public static Date getNowMonthLastDay(Date date) {
Calendar cale = Calendar.getInstance();
cale.setTime(getMinTimeDateByDate(date));
cale.set(Calendar.DAY_OF_MONTH, cale.getActualMaximum(Calendar.DAY_OF_MONTH));
return new Date(cale.getTime().getTime() + 1000L * 60L * 60L * 24L - 1L);
}
/**
* 获取本月最后一天
*
* @return Date
*/
public static Date getTheMonthLastDay(Date date) {
if (date == null) {
return null;
}
Calendar cale = Calendar.getInstance();
cale.setTime(date);
cale.set(Calendar.DAY_OF_MONTH, cale.getActualMaximum(Calendar.DAY_OF_MONTH));
cale.set(Calendar.HOUR, 0);
cale.set(Calendar.HOUR_OF_DAY, 0);
cale.set(Calendar.MINUTE, 0);
cale.set(Calendar.SECOND, 0);
cale.set(Calendar.MILLISECOND, 0);
return cale.getTime();
}
/**
* 获取格式化的时间,默认是yyyy-MM-dd HH:mm:ss此格式
*
* @return
*/
public static String GetFormatTime() {
DateTime dateTime = new DateTime().withZone(DateTimeZone.forID("Asia/Shanghai")).toLocalDateTime().toDateTime();
try {
return dateTime.toString("yyyy-MM-dd HH:mm:ss");
} catch (Exception ex) {
ex.printStackTrace();
return dateTime.toString();
}
}
/**
* 获取格式化的时间
*
* @param formatter 时间格式化字符串
* @return
*/
public static String GetFormatTime(String formatter) {
DateTime dateTime = new DateTime().withZone(DateTimeZone.forID("Asia/Shanghai")).toLocalDateTime().toDateTime();
try {
return dateTime.toString(formatter);
} catch (Exception ex) {
ex.printStackTrace();
return dateTime.toString("yyyy-MM-dd HH:mm:ss");
}
}
/**
* 获取格式化的时间字符串
*
* @param formatTime 自定义时间
* @param formatter 格式化规则
* @return
*/
public static String GetFormatTime(Date formatTime, String formatter) {
SimpleDateFormat sdf = new SimpleDateFormat(formatter);
try {
return sdf.format(formatTime);
} catch (Exception ex) {
return GetFormatTime(formatter);
}
}
public static String GetFormatTime(Date formatTime) {
// YEAR_MONTH_DAY_HOUR_MINUTE
SimpleDateFormat sdf = new SimpleDateFormat(YEAR_MONTH_DAY_HOUR_MINUTE);
try {
return sdf.format(formatTime);
} catch (Exception ex) {
return GetFormatTime(YEAR_MONTH_DAY_HOUR_MINUTE);
}
}
/**
* 短时间变长时间
*
* @param tmp 格式:20190301
* @return
*/
public static String sortTimeToLongTime(String tmp) {
return tmp.substring(0, 4) + "-" + tmp.substring(4, 6) + "-" + tmp.substring(6, 8);
}
/**
* 获取今天开始时间
*
* @return
*/
public static Date getTodayStart() {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.parse(sdf.format(new Date()));
} catch (Exception e) {
}
return null;
}
/**
* 获取今天结束时间
*
* @return
*/
public static Date getTodayEnd() {
LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(new Date().getTime()),
ZoneId.systemDefault());
LocalDateTime endOfDay = localDateTime.with(LocalTime.MAX);
return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
}
public static Date parse(String strDate) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return sdf.parse(strDate);
} catch (Exception e) {
}
return null;
}
public static Integer year(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
String format = sdf.format(date);
return Integer.valueOf(format.substring(0, 4));
} catch (Exception e) {
}
return null;
}
public static Integer month(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
String format = sdf.format(date);
return Integer.valueOf(format.substring(5, 7));
} catch (Exception e) {
}
return null;
}
public static Integer day(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
String format = sdf.format(date);
return Integer.valueOf(format.substring(9, 10));
} catch (Exception e) {
}
return null;
}
/**
* 时分秒转int
*
* @param time hh:mm:ss
* @return hhmmss
*/
public static Integer getIntTime(String time) {
if (time.contains("-")) {
throw new BizException("时间参数错误,请重试");
}
boolean a = time.contains(":");
boolean b = time.contains(":");
List<String> list = new ArrayList<>();
if (!a && !b) {
throw new BizException("时间参数错误,请重试");
}
if (a && !b) {
String[] split = time.split(":");
list.addAll(Arrays.asList(split));
}
if (!a && b) {
String[] split = time.split(":");
list.addAll(Arrays.asList(split));
}
if (a && b) {
String[] split = time.split(":");
for (String s : split) {
String[] split1 = s.split(":");
list.addAll(Arrays.asList(split1));
}
}
StringBuilder times = new StringBuilder();
for (String s : list) {
times.append(s);
}
return Integer.valueOf(times.toString());
}
/**
* 获取周日历
*
* @param date 当前时间
* @param week 0:当前周,负数为减
* @return 加/减几周后的日期
*/
public static List<Date> dateList(Date date, int week) {
Date dateWeek = addDateWeeks(date, week);
DateTime dateTime = new DateTime(dateWeek.getTime());
Date[] mondayAndSunday = getMondayAndSunday(dateTime);
Date weekOne = mondayAndSunday[0];
List<Date> weekDayList = new ArrayList<>();
for (int i = 0; i <= 6; i++) {
weekDayList.add(addDateDays(weekOne, i));
}
return weekDayList;
}
/**
* 根据类型解析开始时间
*
* @param beginTime 开始时间
* @param type 类型:1:日、2:周、3:月、4:年
* @return
*/
public static String getBeginTime(String beginTime, Integer type) {
if (type == null) {
throw new BizException("时间类型参数不能为空");
}
if (StringUtils.isEmpty(beginTime)) {
beginTime = GetFormatTime(getTodayStart(), DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
}
if (type == 1) {
if (beginTime.length() < 10) {
throw new BizException("开始时间参数错误;参数为:" + beginTime);
}
beginTime = beginTime.substring(0, 10) + " 00:00:00";
} else if (type == 2) {
if (beginTime.length() < 10) {
throw new BizException("开始时间参数错误;参数为:" + beginTime);
}
beginTime = beginTime.substring(0, 10) + " 00:00:00";
} else if (type == 3) {
if (beginTime.length() < 7) {
throw new BizException("开始时间参数错误;参数为:" + beginTime);
}
beginTime = beginTime.substring(0, 7) + "-01 00:00:00";
} else if (type == 4) {
if (beginTime.length() < 4) {
throw new BizException("开始时间参数错误;参数为:" + beginTime);
}
beginTime = beginTime.substring(0, 4) + "-01-01 00:00:00";
}
return beginTime;
}
/**
* 解析开始时间
*
* @param beginTime
* @return
*/
public static String getBeginTime(String beginTime) {
if (StringUtils.isEmpty(beginTime)) {
beginTime = GetFormatTime(getTodayStart(), DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
} else if (beginTime.length() < 4) {
throw new BizException("时间格式错误");
} else if (beginTime.length() == 4) {
beginTime = beginTime.substring(0, 4) + "-01-01 00:00:00";
} else if (beginTime.length() >= 7 && beginTime.length() < 10) {
beginTime = beginTime.substring(0, 7) + "-01 00:00:00";
} else if (beginTime.length() >= 10) {
beginTime = beginTime.substring(0, 10) + " 00:00:00";
}
return beginTime;
}
/**
* 根据类型解析结束时间
*
* @param endTime 结束时间
* @param type 类型:1:日、2:周、3:月、4:年
* @return
*/
public static String getEndTime(String endTime, Integer type) {
if (type == null) {
throw new BizException("时间类型参数不能为空");
}
if (StringUtils.isEmpty(endTime)) {
endTime = GetFormatTime(getTodayEnd(), DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
}
if (type == 1) {
if (endTime.length() < 10) {
throw new BizException("结束时间参数错误;参数为:" + endTime);
}
endTime = endTime.substring(0, 10) + " 23:59:59";
} else if (type == 2) {
if (endTime.length() < 10) {
throw new BizException("结束时间参数错误;参数为:" + endTime);
}
endTime = endTime.substring(0, 10) + " 23:59:59";
} else if (type == 3) {
if (endTime.length() < 7) {
throw new BizException("结束时间参数错误;参数为:" + endTime);
}
endTime = GetFormatTime(getNowMonthLastDay(formatDateString(endTime.substring(0, 7), YEAR_MONTH)), YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
} else if (type == 4) {
if (endTime.length() < 4) {
throw new BizException("结束时间参数错误;参数为:" + endTime);
}
endTime = endTime.substring(0, 4) + "-12-31 23:59:59";
}
return endTime;
}
/**
* 解析结束时间
*
* @param endTime
* @return
*/
public static String getEndTime(String endTime) {
if (StringUtils.isEmpty(endTime)) {
endTime = GetFormatTime(getTodayEnd(), DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
} else if (endTime.length() < 4) {
throw new BizException("时间格式错误");
} else if (endTime.length() == 4) {
endTime = endTime.substring(0, 4) + "-12-31 23:59:59";
} else if (endTime.length() >= 7 && endTime.length() < 10) {
endTime = GetFormatTime(getNowMonthLastDay(formatDateString(endTime.substring(0, 7), YEAR_MONTH)), YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
} else if (endTime.length() >= 10) {
endTime = endTime.substring(0, 10) + " 23:59:59";
}
return endTime;
}
/**
* 计算两个时间之间相差 改方法只有计算目标值使用!!!!其他方法请勿使用
*
* @param startDate 开始时间
* @param endDate 结束时间
* @return {{year=0,month=1, days=3}
*/
public static Map<String, Long> getTerm(java.time.LocalDate startDate, java.time.LocalDate endDate) {
HashMap<String, Long> map = new HashMap<>();
try {
int startYear = startDate.getYear();
int startMonth = startDate.getMonthValue();
int startDay = startDate.getDayOfMonth();
int endYear = endDate.getYear();
int endMonth = endDate.getMonthValue();
int endDay = endDate.getDayOfMonth();
java.time.LocalDate nowStartMonth = startDate.with(TemporalAdjusters.firstDayOfMonth());
java.time.LocalDate nowEndMonth = endDate.with(TemporalAdjusters.lastDayOfMonth());
//获取两个日期间隔年
long y = ChronoUnit.YEARS.between(startDate, endDate);
//获取两个日期间隔月
long m = ChronoUnit.MONTHS.between(nowStartMonth, nowEndMonth);
//获取两个日期间隔天
long d = ChronoUnit.DAYS.between(startDate, endDate);
//获取某个月的最后一天
int lastDayOfEndDate = endDate.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
if (startYear == endYear) {
if (startDay == endDay || lastDayOfEndDate == endDay) {
m = endMonth - startMonth;
} else {
//获取传入时间对象的Day值
d = endDate.getDayOfMonth();
}
} else {
if (startDay == endDay || lastDayOfEndDate == endDay) {
d = 0;
} else {
d = endDate.getDayOfMonth();
}
}
map.put("year", y);
map.put("month", m);
map.put("day", d);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
public static int getOneYearDay(int year) {
int days;//某年(year)的天数
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {//闰年的判断规则
days = 366;
} else {
days = 365;
}
return days;
}
public static int intervalJudgment(String restBeginTime, String restEndTime, String beginTime, String endTime) {
if (StringUtil.isEmpty(restBeginTime) || StringUtil.isEmpty(restEndTime)) {
return 1;
}
if (isEffectiveDate(parseDate(beginTime, DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE), parseDate(restBeginTime, DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE), parseDate(restEndTime, DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE))) {
return 2;
}
if (isEffectiveDate(parseDate(endTime, DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE), parseDate(restBeginTime, DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE), parseDate(restEndTime, DateUtil.YEAR_MONTH_DAY_HOUR_MINUTE))) {
return 2;
}
return 1;
}
public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
if (nowTime.getTime() == startTime.getTime()
|| nowTime.getTime() == endTime.getTime()) {
return true;
}
Calendar date = Calendar.getInstance();
date.setTime(nowTime);
Calendar begin = Calendar.getInstance();
begin.setTime(startTime);
Calendar end = Calendar.getInstance();
end.setTime(endTime);
if (date.after(begin) && date.before(end)) {
return true;
} else {
return false;
}
}
public static int getHourByCalendar(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int hour = cal.get(Calendar.HOUR);//小时
int minute = cal.get(Calendar.MINUTE);//分
return hour;
}
/**
* 获取两个日期之间的所有日期(字符串格式, 按天计算)
*
* @param startTime String 开始时间 yyyy-MM-dd
* @param endTime String 结束时间 yyyy-MM-dd
* @return
*/
public static List<String> getBetweenDays(String startTime, String endTime) {
if (StringUtils.isEmpty(startTime) || StringUtils.isEmpty(endTime)) {
return new ArrayList<>();
}
//1、定义转换格式
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date start = null;
Date end = null;
try {
start = df.parse(startTime);
end = df.parse(endTime);
} catch (ParseException e) {
e.printStackTrace();
}
if (StringUtil.isEmpty(start) || StringUtil.isEmpty(end)) {
return new ArrayList<>();
}
if (start.getTime() > end.getTime()) {
throw new BizException("开始时间不能大于结束时间");
}
List<String> result = new ArrayList<String>();
Calendar tempStart = Calendar.getInstance();
tempStart.setTime(start);
tempStart.add(Calendar.DAY_OF_YEAR, 1);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar tempEnd = Calendar.getInstance();
tempEnd.setTime(end);
result.add(sdf.format(start));
while (tempStart.before(tempEnd)) {
result.add(sdf.format(tempStart.getTime()));
tempStart.add(Calendar.DAY_OF_YEAR, 1);
}
if (start.getTime() != end.getTime()) {
result.add(sdf.format(end));
}
return result;
}
public static ArrayList<String> getDays(int intervals) {
ArrayList pastDaysList = new ArrayList<>();
for (int i = 0; i < intervals; i++) {
pastDaysList.add(getPastDate(i));
}
return pastDaysList;
}
public static String getWeek(String dateTime) {
String week = "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(dateTime);
SimpleDateFormat dateFm = new SimpleDateFormat("EEEE", Locale.CHINESE);
dateFm.setTimeZone(TimeZone.getTimeZone("Etc/GMT-8"));
week = dateFm.format(date);
week = week.replaceAll("星期", "周");
} catch (ParseException e) {
e.printStackTrace();
}
return week;
}
public static String getPastDate(int past) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + past);
Date today = calendar.getTime();
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String result = format.format(today);
return result;
}
public static String getCurrentDate(String dateStr, Integer second) {
SimpleDateFormat df = new SimpleDateFormat(YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
Date date = null;
try {
date = df.parse(dateStr);
date.setTime(date.getTime() + second);
} catch (Exception e) {
e.printStackTrace();
}
return df.format(date);
}
public static String addDateDays(String dateStr, int days) {
String timeStr = dateStr.split(" ")[1];
dateStr = dateStr.split(" ")[0];
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat df = new SimpleDateFormat(YEAR_MONTH_DAY_HOUR_MINUTE_SECOND);
Date date = null;
try {
date = sdf.parse(dateStr);
date = addDateDays(date, days);
} catch (Exception e) {
e.printStackTrace();
}
if (date != null) {
if (!StringUtil.isEmpty(timeStr)) {
return df.format(date) + " " + timeStr;
}
return df.format(date);
}
return null;
}