Java 日期计算工具类(日期比较,类型转换,日期加减计算,首尾日期获取)
package com.igrs.met.utils; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; public class DateUtils { private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** * 日期比较 * @return true: t1 > t2 */ public static boolean compare(Date t1 , Date t2 , String formatPattern) { String format1 = dateToStr(t1); String format2 = dateToStr(t2); DateTimeFormatter formatter = DateTimeFormat.forPattern(formatPattern); DateTime season1 = DateTime.parse(format1 , formatter); DateTime season2 = DateTime.parse(format2 , formatter); return season1.isAfter(season2); } /** * date类型 -> string类型 * * @param date * @return */ public static String dateToStr(Date date) { if (date == null) return StringUtils.EMPTY; DateTime dateTime = new DateTime(date); return dateTime.toString(STANDARD_FORMAT); } /** * date类型 -> string类型 * * @param date * @param formatPattern * @return */ public static String dateToStr(Date date, String formatPattern) { if (date == null) return StringUtils.EMPTY; DateTime dateTime = new DateTime(date); return dateTime.toString(formatPattern); } /** * string类型 -> date类型 * * @param timeStr * @return */ public static Date strToDate(String timeStr) { DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern(STANDARD_FORMAT); DateTime dateTime = dateTimeFormatter.parseDateTime(timeStr); return dateTime.toDate(); } /** * 判断date日期是否过期(与当前时刻比较) * * @param date * @return */ public static boolean isTimeExpired(Date date) { if (null == date) return true; String timeStr = dateToStr(date); return isBeforeNow(timeStr); } /** * 判断date日期是否过期(与当前时刻比较) * * @param timeStr * @return */ public static boolean isTimeExpired(String timeStr) { if (StringUtils.isBlank(timeStr)) return true; return isBeforeNow(timeStr); } /** * 判断timeStr是否在当前时刻之前 * * @param timeStr * @return */ private static boolean isBeforeNow(String timeStr) { DateTimeFormatter format = DateTimeFormat.forPattern(STANDARD_FORMAT); DateTime dateTime = DateTime.parse(timeStr, format); return dateTime.isBeforeNow(); } /** * 日期加天数 * * @param date * @param days * @return */ public static Date plusDays(Date date, Integer days) { return plusOrMinusDays(date, days, 0); } /** * 日期减天数 * * @param date * @param days * @return */ public static Date minusDays(Date date, Integer days) { return plusOrMinusDays(date, days, 1); } /** * 加减天数 * * @param date * @param days * @param type 0:加天数 1:减天数 * @return */ private static Date plusOrMinusDays(Date date, Integer days, Integer type) { if (null == date) return null; days = null == days ? 0 : days; DateTime dateTime = new DateTime(date); if (type == 0) { dateTime = dateTime.plusDays(days); } else { dateTime = dateTime.minusDays(days); } return dateTime.toDate(); } /** * 日期加分钟 * * @param date * @param minutes * @return */ public static Date plusMinutes(Date date, Integer minutes) { return plusOrMinusMinutes(date, minutes, 0); } /** * 日期减分钟 * * @param date * @param minutes * @return */ public static Date minusMinutes(Date date, Integer minutes) { return plusOrMinusMinutes(date, minutes, 1); } /** * 加减分钟 * * @param date * @param minutes * @param type 0:加分钟 1:减分钟 * @return */ private static Date plusOrMinusMinutes(Date date, Integer minutes, Integer type) { if (null == date) return null; minutes = null == minutes ? 0 : minutes; DateTime dateTime = new DateTime(date); if (type == 0) { dateTime = dateTime.plusMinutes(minutes); } else { dateTime = dateTime.minusMinutes(minutes); } return dateTime.toDate(); } /** * 日期加月份 * * @param date * @param months * @return */ public static Date plusMonths(Date date, Integer months) { return plusOrMinusMonths(date, months, 0); } /** * 日期减月份 * * @param date * @param months * @return */ public static Date minusMonths(Date date, Integer months) { return plusOrMinusMonths(date, months, 1); } /** * 加减月份 * * @param date * @param months * @param type 0:加月份 1:减月份 * @return */ private static Date plusOrMinusMonths(Date date, Integer months, Integer type) { if (null == date) return null; months = null == months ? 0 : months; DateTime dateTime = new DateTime(date); if (type == 0) { dateTime = dateTime.plusMonths(months); } else { dateTime = dateTime.minusMonths(months); } return dateTime.toDate(); } /** * 判断target是否在开始和结束时间之间 * * @param target * @param startTime * @param endTime * @return */ public static boolean isBetweenStartAndEndTime(Date target, Date startTime, Date endTime) { if (null == target || null == startTime || null == endTime) { return false; } DateTime dateTime = new DateTime(target); return dateTime.isAfter(startTime.getTime()) && dateTime.isBefore(endTime.getTime()); } /** * 获取当前月第一天 * @param month * @return String yyyy-MM-dd hh:mm:ss */ public static String getFirstDayOfMonth(int month) { Calendar calendar = Calendar.getInstance(); // 设置月份 calendar.set(Calendar.MONTH, month - 1); // 获取某月最小天数 int firstDay = calendar.getActualMinimum(Calendar.DAY_OF_MONTH); // 设置日历中月份的最小天数 calendar.set(Calendar.DAY_OF_MONTH, firstDay); // 格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(calendar.getTime())+" 00:00:00"; } /** * 获取当前月最后一天 * @param month * @return String yyyy-MM-dd hh:mm:ss */ public static String getLastDayOfMonth(int month) { Calendar calendar = Calendar.getInstance(); // 设置月份 calendar.set(Calendar.MONTH, month - 1); // 获取某月最大天数 int lastDay=0; //2月的平年瑞年天数 if(month==2) { // 这个api在计算2020年2月的过程中有问题 lastDay = calendar.getLeastMaximum(Calendar.DAY_OF_MONTH); }else { lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); } // 设置日历中月份的最大天数 calendar.set(Calendar.DAY_OF_MONTH, lastDay); // 格式化日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(calendar.getTime())+" 23:59:59"; } }