这是一个Java日期处理工具类(DateUtils),提供了丰富的日期操作功能。,使用Joda-Time和Calendar类实现,支持常见的业务场景日期处理需求。
主要包括:
1) 多种日期格式的格式化与解析;
2) 日期加减操作(秒、分钟、小时、天、周、月、年);
3) 获取特定时间点(当月/年第一天/最后一天、周区间);
4) 日期判断(是否周末、是否在时间段内、是否当月);
5) 获取相对日期(上月、上年同日、上一天等);
6) 日期计算(时间差、月份最大天数等)。
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 日期处理工具类
*/
public class DateUtils {
/**
* 时间格式(yyyy)
*/
public final static String YEAR_PATTERN = "yyyy";
/**
* 时间格式(yyyy-MM)
*/
public final static String MONTH_PATTERN = "yyyy-MM";
/**
* 时间格式(yyyy-MM-dd)
*/
public final static String DATE_PATTERN = "yyyy-MM-dd";
/**
* 时间格式(yyyy-MM-dd HH:mm)
*/
public final static String DATE_MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
/**
* 时间格式(yyyy-MM-dd HH:mm:ss)
*/
public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
/**
* 时间格式(HH:mm:ss)
*/
public final static String TIME_PATTERN = "HH:mm:ss";
/**
* 时间格式(HH:mm)
*/
public final static String MINUTE_PATTERN = "HH:mm";
/**
* 日期格式化 日期格式为:yyyy-MM-dd
*
* @param date 日期
* @return 返回yyyy-MM-dd格式日期
*/
public static String format(Date date) {
return format(date, DATE_PATTERN);
}
/**
* 日期格式化 日期格式为:yyyy-MM-dd
*
* @param date 日期
* @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN
* @return 返回yyyy-MM-dd格式日期
*/
public static String format(Date date, String pattern) {
if (date != null) {
SimpleDateFormat df = new SimpleDateFormat(pattern);
return df.format(date);
}
return null;
}
/**
* 日期解析
*
* @param date 日期
* @param pattern 格式,如:DateUtils.DATE_TIME_PATTERN
* @return 返回Date
*/
public static Date parse(String date, String pattern) {
try {
return new SimpleDateFormat(pattern).parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 字符串转换成日期
*
* @param strDate 日期字符串
* @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN
*/
public static Date stringToDate(String strDate, String pattern) {
if (StringUtils.isBlank(strDate)) {
return null;
}
DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
return fmt.parseLocalDateTime(strDate).toDate();
}
/**
* 根据周数,获取开始日期、结束日期
*
* @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();
}
/**
* 获取当月的第一天
*
* @return 当月的第一天
*/
public static Date getCurrMonthFirst() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, 0);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
/**
* 获取当月的最后一天
*
* @return 当月的最后一天
*/
public static Date getCurrMonthLast() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.MONTH, 1);
calendar.set(Calendar.DAY_OF_MONTH, 0);
return calendar.getTime();
}
/**
* 获取当年的第一天
*
* @return
*/
public static Date getCurrYearFirst() {
Calendar currCal = Calendar.getInstance();
int currentYear = currCal.get(Calendar.YEAR);
return getYearFirst(currentYear);
}
/**
* 获取当年的最后一天
*
* @return
*/
public static Date getCurrYearLast() {
Calendar currCal = Calendar.getInstance();
int currentYear = currCal.get(Calendar.YEAR);
return getYearLast(currentYear);
}
/**
* 获取某年第一天日期
*
* @param year 年份
* @return Date
*/
public static Date getYearFirst(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
return calendar.getTime();
}
/**
* 获取某年最后一天日期
*
* @param year 年份
* @return Date
*/
public static Date getYearLast(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.roll(Calendar.DAY_OF_YEAR, -1);
return calendar.getTime();
}
/**
* 判断是否是周末
*
* @param date
* @return
*/
public static boolean isWeekends(Date date) {
Calendar ca = Calendar.getInstance();
ca.setTime(date);
if (ca.get(Calendar.DAY_OF_WEEK) == 1
|| ca.get(Calendar.DAY_OF_WEEK) == 7) {
return true;
}
return false;
}
/**
* 判断当前时间是否在[startTime, endTime]区间,注意三个参数的时间格式要一致
*
* @param nowTime
* @param startTime
* @param endTime
* @return 在时间段内返回true,不在返回false
*/
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);
return date.after(begin) && date.before(end);
}
/**
* 判断当前时间是否在[startTime, endTime]区间
*
* @param nowTime 时间
* @param startTime 字符串
* @param endTime 字符串
* @return 在时间段内返回true,不在返回false
*/
public static boolean isEffectiveDate(Date nowTime, String startTime, String endTime) {
Date start = parse(startTime, TIME_PATTERN);
Date end = parse(endTime, TIME_PATTERN);
if (nowTime == null || start == null || end == null) {
return false;
}
return isEffectiveDate(nowTime, start, end);
}
public static boolean inCurrentMonth(Date givenDate) {
Date today = new Date();
return givenDate.getMonth() == today.getMonth() && givenDate.getYear() == today.getYear();
}
/**
* 根据传入日期获取上月日期
* @param date
* @return
* @throws ParseException
*/
public static String getLastMonthDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
// 使用Calendar类调整日期
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
calendar.add(Calendar.MONTH, -1); // 将月份减去1,得到上个月的日期
return sdf.format(calendar.getTime());
}
/**
* 根据传入日期获取上年同月日期
* @return
*/
public static String getLastYearMonthDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
// 使用Calendar类调整日期
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
calendar.add(Calendar.YEAR, -1); // 将年减一获取上年同月
return sdf.format(calendar.getTime());
}
/**
* 获取上月传入天
* @param date
* @return
*/
public static String getLastMonthDay(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
// 使用Calendar类调整日期
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
calendar.add(Calendar.MONTH, -1); // 上月传入天
return sdf.format(calendar.getTime());
}
/**
* 获取传入日期上一年
* @param date
* @return
*/
public static String getLastYearDate(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
// 使用Calendar类调整日期
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
calendar.add(Calendar.YEAR, -1); // 上期年
return sdf.format(calendar.getTime());
}
/**
* 获取上一天
* @param date
* @return
*/
public static String getLastDay(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 使用Calendar类调整日期
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
calendar.add(Calendar.DAY_OF_MONTH, -1); // 获取上一天
return sdf.format(calendar.getTime());
}
/**
* 根据日期获取星期几
* @return
*/
public static String getWeekByDate(String strDate) {
// 获取当前日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 解析日期字符串
Date parseDate = null;
try {
parseDate = sdf.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
// 获取日期对应的星期几
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar calendar = Calendar.getInstance();
calendar.setTime(parseDate);
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
return weekDays[dayOfWeek - 1];
}
/**
* 获取传入日期本月开始日期
* @param date
* @return
*/
public static String getStartOfMonth(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
return sdf2.format(calendar.getTime());
}
/**
* 获取传入日期本月结束日期
* @param date
* @return
*/
public static String getEndOfMonth(String date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Calendar calendar = Calendar.getInstance();
try {
calendar.setTime(sdf.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 59);
calendar.set(Calendar.SECOND, 59);
calendar.set(Calendar.MILLISECOND, 999);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
return sdf2.format(calendar.getTime());
}
/**
* 获取昨天日期
* @return
*/
public static String getYesterday() {
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -1);
Date yesterday = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String formattedDate = sdf.format(yesterday);
return formattedDate;
}
/**
* 获取两个日期时间差
*/
public static long getTimeDifference(Date startDate, Date endDate) {
long startTime = startDate.getTime();
long endTime = endDate.getTime();
//计算毫秒差值
long millisecondDiff = endTime - startTime;
long hourDiff = millisecondDiff / (1000 * 60 * 60);
return hourDiff;
}
/**
* 获取月份最大天
* @param date
* @return
*/
public static String getNaxNum(String date) {
Calendar c = Calendar.getInstance();
SimpleDateFormat sdf0 = new SimpleDateFormat("yyyy-MM");
Date dd = null;
try {
dd = sdf0.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(dd);
int cc = c.getActualMaximum(Calendar.DAY_OF_MONTH);
return String.valueOf(cc);
}
}