根据指定日期获取下一年的这一天
特殊例子:2020/2/29这一天 获取下一年的日期为2021/2/28。其他不变
public static String sameDayOfNextYear(String dateStr) {
Calendar cal = setCalendarTime(dateStr);
cal.add(Calendar.YEAR, 1);
if (!isLastDayOfMonth(dateStr)) {
cal.set(Calendar.DAY_OF_MONTH, cal.get(Calendar.DATE));
} else {
cal.add(Calendar.MONTH, 1);
cal.set(Calendar.DAY_OF_MONTH, 0);
}
Date time = cal.getTime();
return dateToStr(time);
}
//判断日期是否为月末
public static boolean isLastDayOfMonth(String dateStr) {
String format = “yyyy-MM-dd”;
Calendar cal = setCalendarTime(dateStr, format);
cal.set(Calendar.DATE, (cal.get(Calendar.DATE) + 1));
if (cal.get(Calendar.DAY_OF_MONTH) == 1) {
return true;
}
return false;
}
根据指定日期获取下个月的这一天
特殊例子:如果是月末31号或30号,而下个月没有这一天,将获取下月月末。
如:2020/1/31获取下个月这一天结果为2020/2/29
public static Date nextEffectiveDate(Date effectiveDate) {
int year = Integer.parseInt(TimeUtils.format(effectiveDate,"yyyy"));
int nextMonth = Integer.parseInt(TimeUtils.format(effectiveDate,"MM"))+1;
int day = Integer.parseInt(TimeUtils.format(effectiveDate,"dd"));;
if (nextMonth > 12) {
nextMonth = 1;
year += 1;
}
StringBuilder sb = new StringBuilder();
String nextEffectiveDay = appendDate(sb, year, nextMonth, day);
if (isValidDate(nextEffectiveDay)) {
return nextEffectiveDay;
} else {
Calendar cal = setCalendarTime( new SimpleDateFormat("yyyy-MM-dd").format(effectiveDate));
cal.set(Calendar.YEAR, year);
cal.set(Calendar.MONTH, nextMonth);
cal.set(Calendar.DAY_OF_MONTH, 0);
nextEffectiveDay = new SimpleDateFormat("yyyy-MM-dd").format(cal.getTime());
}
return sdf.parse(nextEffectiveDay);
}
//日期拼接
public static String appendDate(StringBuilder sb, int year, int month, int day) {
sb.append(year)
.append('-').append(month > 9 ? month : "0"+month)
.append('-').append(day > 9 ? day : "0"+day);
return sb.toString();
}
//判断一个日期是否合法
public static boolean isValidDate(String dateStr) {
Boolean convertStatus = true;
//指定日期格式为四位年、两位月份、两位日期,注意 yyyy-MM-dd 区分大小写
String format = yMd;
SimpleDateFormat sdf = new SimpleDateFormat(format);
//设置lenient为false,否则SimpleDateFormat会比较宽松地验证日期。比如:2020-02-29会被接受,并转换成2020-03-01
sdf.setLenient(false);
try {
sdf.parse(dateStr);
} catch (ParseException e) {
logger.warn("日期格式不正确!!!"+e.toString());
convertStatus = false;
}
return convertStatus;
}