import org.apache.commons.lang.StringUtils; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; public class DateUtils { /** yyyy-MM-dd HH:mm:ss */ public static final String YMD_HMS = "yyyy-MM-dd HH:mm:ss"; /** yyyyMMddHHmmss */ public static final String YMDHMS = "yyyyMMddHHmmss"; public static final String YMDHMSSS = "yyyyMMddHHmmssSSS"; /** yyyyMMdd */ public static final String YMD = "yyyyMMdd"; /** yyyy-MM */ public static final String YM = "yyyy-MM"; /** MMdd */ public static final String MD = "MMdd"; public static final String D = "dd"; /** MM-dd */ public static final String MD_DASH = "MM-dd"; /** yyyy/MM/dd */ public static final String YMD_SLASH = "yyyy/MM/dd"; /** yyyy-MM-dd */ public static final String YMD_DASH = "yyyy-MM-dd"; /** yyyy-MM-dd H:m */ public static final String YMD_DASH_WITH_TIME = "yyyy-MM-dd H:m"; /** yyyy-MM-dd HH:mm */ public static final String DATETIME_YMD_DASH = "yyyy-MM-dd HH:mm"; /** yyyy/dd/MM */ public static final String YDM_SLASH = "yyyy/dd/MM"; /** yyyy/MM/dd HH:mm:ss */ public static final String YMD_SLAHMS = "yyyy/MM/dd HH:mm:ss"; /** yyyy-dd-MM */ public static final String YDM_DASH = "yyyy-dd-MM"; /** HHmm */ public static final String HM = "HHmm"; /** HH:mm */ public static final String HM_COLON = "HH:mm"; /** HH:mm:ss */ public static final String HMS_COLON = "HH:mm:ss"; /** yyyy-MM */ public static final String YM_DASH = "yyyy-MM"; /** yyyy年MM月dd日 */ public static final String YMD_NYRSH = "yyyy年MM月dd日"; public static final String YMDH_M_S = "yyyyMMdd HH:mm:ss"; public static final String HH_ONLY = "HH"; public static final long DAY = 24 * 60 * 60 * 1000L; public static final long MINUTE = 60 * 1000L; public static final long SECOND = 1000L; private static final Map<String, DateFormat> DFS = new HashMap<String, DateFormat>(); /** * 得到系统日期 * @return */ public static String getSysdate() { Date sysDate = new Date(); SimpleDateFormat sdf = new SimpleDateFormat(YMD_DASH); return sdf.format(sysDate); } /** * 获取当前时间的时间戳(精确到秒) * @return */ public static String getCurrentTimeStamp() { return String.valueOf(new Date().getTime() / 1000L); } /** * 获取当前时间的时间戳(精确到毫秒) * @return */ public static Long getCurrentTimeStamps() { return new Date().getTime(); } /** * 将指定的日期格式字符串转换为时间戳(精确到秒) * @param date 日期字符串 * @param pattern 日期格式 * @return */ public static String date2TimeStamp(String date, String pattern) { try { SimpleDateFormat dateformat = new SimpleDateFormat(pattern); Date s = dateformat.parse(date); return String.valueOf(s.getTime() / 1000L); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 获取指定时间的时间戳(精确到毫秒) * @param date * @return */ public static Long getTimeStampsByDate(Date date) { return date.getTime(); } /** * 当前日期的前N天或后N天的时间戳(精确到秒) * @param days 当为负整数时,为前N天,当为正整数时,为后N天 * @return */ public static String getCurrentDayTime(int days) { return getDayTime(days); } /** * 指定日期的前N天或后N天的时间戳(精确到秒) * @param date 指定日期 * @param days 当为负整数时,为前N天,当为正整数时,为后N天 * @return */ public static String getDayTime(Date date, int days) { String dateStr = format(dayOffset(date, days), YMD_HMS); return date2TimeStamp(dateStr, YMD_HMS); } /** * 获取指定日期最后一秒的时间戳(精确到秒) * @return */ public static String getTimeDayLastSecond(Date date) { if (date == null) { return null; } return date2TimeStamp(format(date, YMD_DASH).concat(" 23:59:59"), YMD_HMS); } /** * 根据日期格式 对指定日期格式化 * @param date * @param pattern * @return */ public static Date formatDate(Date date, String pattern) { if (date == null) { return null; } return parse(format(date, pattern), pattern); } /** * 获取指定日期最后一秒的日期 * @param date * @return */ public static Date getEndDate(Date date) { if (date == null) { return null; } return parse((format(date, YMD_DASH) + " 23:59:59"), YMD_HMS); } /** * 将指定的时间戳字符串转换为指定日期格式字符串 * @param timestampStr 时间戳字符串(精确到秒) * @param pattern 日期时间格式 * @return */ public static String timeStampToDate(String timestampStr, String pattern) { if(StringUtils.isEmpty(timestampStr)) return null; Long timestamp = Long.parseLong(timestampStr) * 1000; String date = new SimpleDateFormat(pattern).format(new Date(timestamp)); return date; } /** * 将指定的时间戳字符串转换为日期 * @param timestampStr 时间戳字符串(精确到秒) * @return */ public static Date timeStampToDate(String timestampStr) { Long timestamp = Long.parseLong(timestampStr) * 1000; return new Date(timestamp); } /** * 将指定日期的字符串 按格式转换成日期 * @param dateStr 日期字符串 * @param pattern 日期格式 * @return */ public static Date parse(String dateStr, String pattern) { if (StringUtils.isEmpty(dateStr)) { return null; } Date date; try { date = getFormat(pattern).parse(dateStr); } catch (ParseException e) { e.getStackTrace(); return null; } return date; } /** * 将指定日期按照日期格式转换成日期字符串 * @param date 指定日期 * @param pattern 日期格式 * @return */ public static String format(Date date, String pattern) { if (date == null) { return null; } return getFormat(pattern).format(date); } /** * 按日期格式要求,输出DateFormat格式 * @param pattern * @return */ public static DateFormat getFormat(String pattern) { DateFormat format = DFS.get(pattern); if (format == null) { format = new SimpleDateFormat(pattern); DFS.put(pattern, format); } return format; } /** * 判断输入的年、月、日是否是有效日期 * @param year * @param month (1-12) * @param day (1-31) * @return */ public static boolean isValid(int year, int month, int day) { if (month > 0 && month < 13 && day > 0 && day < 32) { int mon = month - 1; Calendar calendar = new GregorianCalendar(year, mon, day); if (calendar.get(Calendar.YEAR) == year && calendar.get(Calendar.MONTH) == mon && calendar.get(Calendar.DAY_OF_MONTH) == day) { return true; } } return false; } /** * 将指定日期转换为日历格式的日期对象 * @param date * @return */ private static Calendar convert(Date date) { Calendar calendar = new GregorianCalendar(); calendar.setTime(date); return calendar; } /** * 返回指定日期按年份【前移】或【后移】后的日期 * @param date 指定日期 * @param offset 当为正整数,则后移,当为负整数,则前移 * @return */ public static Date yearOffset(Date date, int offset) { return offsetDate(date, Calendar.YEAR, offset); } /** * 回指定日期按月份【前移】或【后移】后的日期 * @param date 指定日期 * @param offset 当为正整数,则后移,当为负整数,则前移 * @return */ public static Date monthOffset(Date date, int offset) { return offsetDate(date, Calendar.MONTH, offset); } /** * 返回指定日期按天数【前移】或【后移】后的日期 * @param date 指定日期 * @param offset 当为正整数,则后移,当为负整数,则前移 * @return */ public static Date dayOffset(Date date, int offset) { return offsetDate(date, Calendar.DATE, offset); } /** * 返回指定日期按小时数【前移】或【后移】后的日期 * @param date 指定日期 * @param offset 当为正整数,则后移,当为负整数,则前移 * @return */ public static Date hoursOffset(Date date, int offset) { return offsetDate(date, Calendar.HOUR, offset); } /** * 返回指定日期按分钟数【前移】或【后移】后的日期 * @param date 指定日期 * @param offset 当为正整数,则后移,当为负整数,则前移 * @return */ public static Date minuteOffset(Date date, int offset) { return offsetDate(date, Calendar.MINUTE, offset); } /** * 返回指定日期按秒数【前移】或【后移】后的日期 * @param date 指定日期 * @param offset 当为正整数,则后移,当为负整数,则前移 * @return */ public static Date secondOffset(Date date, int offset) { return offsetDate(date, Calendar.SECOND, offset); } /** * 返回指定日期按指定方式【前移】或【后移】后的日期< * @param date 指定日期 * @param field 指定方式,如:Calendar.YEAR 按年份,Calendar.MONTH 按月份,Calendar.DATE 按天数 * @param offset 当为正整数,则后移,当为负整数,则前移 * @return */ public static Date offsetDate(Date date, int field, int offset) { Calendar calendar = convert(date); calendar.add(field, offset); return calendar.getTime(); } /** * 返回指定日期所在当月的第一天的日期 * @param date * @return */ public static Date firstDay(Date date) { Calendar calendar = convert(date); calendar.set(Calendar.DATE, 1); return calendar.getTime(); } /** * 返回指定日期所在当月的最后一天的日期 * @param date * @return */ public static Date lastDay(Date date) { Calendar calendar = convert(date); calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); return calendar.getTime(); } /** * 返回两个日期间的差异天数 * @param date1 参照日期 * @param date2 比较日期 * @return 参照日期与比较日期之间的天数差异,正数表示参照日期在比较日期之后,0表示两个日期同天,负数表示参照日期在比较日期之前 int */ public static int dayDiff(Date date1, Date date2) { long diff = date1.getTime() - date2.getTime(); return (int) (diff / DAY); } /** * 返回两个日期间的差异月数 * @param date1 参照日期 * @param date2 比较日期 * @return int */ public static int monthDiff(Date date1, Date date2) { Calendar c1 = convert(date1); Calendar c2 = convert(date2); int years = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR); int months = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH); return years * 12 + months; } /** * 返回两个日期间的差异月数<br /> * @param date1 * @param date2 * @return int */ public static int monthAfterDiff(Date date1, Date date2) { int flag = 0; Calendar c1 = convert(date1); Calendar c2 = convert(date2); int years = c2.get(Calendar.YEAR) - c1.get(Calendar.YEAR); int months = c2.get(Calendar.MONTH) - c1.get(Calendar.MONTH); if (isEndOfMonth(c1) && isEndOfMonth(c2)) { flag = 0; } else { if (c1.get(Calendar.DAY_OF_MONTH) > c2.get(Calendar.DAY_OF_MONTH)) { flag = 0; } else if (c1.get(Calendar.DAY_OF_MONTH) == c2.get(Calendar.DAY_OF_MONTH)) { flag = 0; } else { flag = 1; } } return years * 12 + months + flag; } /** * 判断这一天是否是月底 * @version 0.1 2015年6月3日 * @param calendar * @return boolean */ public static boolean isEndOfMonth(Calendar calendar) { int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); if (dayOfMonth == calendar.getActualMaximum(Calendar.DAY_OF_MONTH)) return true; return false; } /** * 返回两个日期间的差异天数--方法2,按天计算;| 上面是按24小时的倍数计算的; * @param date1 参照日期 * @param date2 比较日期 * @return 参照日期与比较日期之间的天数差异,正数表示参照日期在比较日期之后,0表示两个日期同天,负数表示参照日期在比较日期之前 int * @throws ParseException */ public static int dayDiffByDay(Date date1, Date date2) throws ParseException { // 日期时间转换为年月日 String startStr = DateUtils.format(date1, DateUtils.YMD_DASH); Date startDate = DateUtils.parse(startStr, DateUtils.YMD_DASH); String endStr = DateUtils.format(date2, DateUtils.YMD_DASH); Date endDate = DateUtils.parse(endStr, DateUtils.YMD_DASH); long diff = startDate.getTime() - endDate.getTime(); return (int) (diff / DAY); } /** * 返回两个日期间的差异分钟数 * @version 0.1 2013年10月30日 * @param date1 参照日期 * @param date2 比较日期 * @return 参照日期与比较日期之间的分钟数差异,正数表示参照日期在比较日期之后,0表示两个日期同分,负数表示参照日期在比较日期之前 int */ public static int minuteDiff(Date date1, Date date2) { long diff = date1.getTime() - date2.getTime(); return (int) (diff / MINUTE); } /** * 返回两个日期间的差异秒数 * @param date1 参照日期 * @param date2 比较日期 * @return 参照日期与比较日期之间的秒数差异,正数表示参照日期在比较日期之后,0表示两个日期同分,负数表示参照日期在比较日期之前 int */ public static int secondDiff(Date date1, Date date2) { long diff = date1.getTime() - date2.getTime(); return (int) (diff / SECOND); } /** * 将指定日期转换为小时数 * @param date * @return Double */ public static Double hour(Date date) { SimpleDateFormat st = new SimpleDateFormat("yyyyMMddHH"); return Double.parseDouble(st.format(date)); } /** * 获取当月的最后一天是几号 * @return int */ public static int getMonthDays() { Calendar calendar = Calendar.getInstance(); int maxDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH); return maxDay; } /** * 获取今天是几号 * @return int */ public static int getDateByDay() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.DATE); } /** * 获取今天是几月 * @return int */ public static int getMonthByDay() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.MONTH) + 1; } /** * 获取今天是那年 * @return int */ public static int getYearByDay() { Calendar calendar = Calendar.getInstance(); return calendar.get(Calendar.YEAR); } /** * 获取指定日期是星期几 * @param date 指定日期 * @return String */ public static String getWeekOfDate(Date date) { String[] weekDays = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; Calendar cal = Calendar.getInstance(); cal.setTime(date); int w = cal.get(Calendar.DAY_OF_WEEK) - 1; if (w < 0) w = 0; return weekDays[w]; } /** * Description:获取给定日期当月的工作日集合 * @param year 指定年份 * @param month 指定月份 * @return List<Date> */ public static List<Date> getDates(int year, int month) { List<Date> dates = new ArrayList<Date>(); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, month - 1); cal.set(Calendar.DATE, 1); while (cal.get(Calendar.YEAR) == year && cal.get(Calendar.MONTH) < month) { int day = cal.get(Calendar.DAY_OF_WEEK); if (!(day == Calendar.SUNDAY || day == Calendar.SATURDAY)) { dates.add((Date) cal.getTime().clone()); } cal.add(Calendar.DATE, 1); } return dates; } /** * 取得当月天数 * @return int */ public static int getCurrentMonthLastDay() { Calendar a = Calendar.getInstance(); a.set(Calendar.DATE, 1);// 把日期设置为当月第一天 a.roll(Calendar.DATE, -1);// 日期回滚一天,也就是最后一天 int maxDate = a.get(Calendar.DATE); return maxDate; } /** * 得到指定月的天数 * @param year 指定年份 * @param month 指定月份 * @return int */ public static int getMonthLastDay(int year, int month) { Calendar a = Calendar.getInstance(); a.set(Calendar.YEAR, year); a.set(Calendar.MONTH, month - 1); a.set(Calendar.DATE, 1);// 把日期设置为当月第一天 a.roll(Calendar.DATE, -1);// 日期回滚一天,也就是最后一天 int maxDate = a.get(Calendar.DATE); return maxDate; } private static Calendar getCalendar() { TimeZone tz = TimeZone.getDefault(); return Calendar.getInstance(tz); } public static String getYear() { return String.valueOf(getCalendar().get(1)); } public static String getMonth() { return strFormat(getCalendar().get(2) + 1); } public static String getDay() { return strFormat(getCalendar().get(5)); } public static String getFormatDate(String separator) { return getYear() + separator + getMonth() + separator + getDay(); } public static String getHour() { return strFormat(getCalendar().get(11)); } public static String getMinute() { return strFormat(getCalendar().get(12)); } public static String getSecond() { return strFormat(getCalendar().get(13)); } private static String strFormat(int data) { String str = String.valueOf(data); if (data <= 9) { str = "0" + str; } return str; } public static String getDayTime(int days) { Calendar cal = Calendar.getInstance(); cal.add(6, days); String timeStamp = String.valueOf(cal.getTimeInMillis() / 1000L); return timeStamp; } /** * 获取某天的某个时间点 * @param date * @param hour * @param minute * @param second * @return */ public static Date getDateByTime(Date date,int hour,int minute,int second) { date.setHours(hour); date.setMinutes(minute); date.setSeconds(second); return date; } /** * 判断指定时间是否在某个时间段内 * @param nowTime 指定时间 * @param beginTime 开始时间 * @param endTime 结束时间 * @return */ public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) { Calendar date = Calendar.getInstance(); date.setTime(nowTime); Calendar begin = Calendar.getInstance(); begin.setTime(beginTime); Calendar end = Calendar.getInstance(); end.setTime(endTime); if (date.after(begin) && date.before(end)) { return true; } else { return false; } } /** * 比较两个日期的大小(仅比较天,即精确到天) * @param date1 * @param date2 * @return 返回值 (1,0,-1) */ public static int compareDate(Date date1, Date date2) throws Exception{ if(date1 == null || date2 != null){ throw new Exception("比较日期不能为空"); } date1 = parse(format(date1, YMD_DASH), YMD_DASH); date2 = parse(format(date2, YMD_DASH), YMD_DASH); return date1.compareTo(date2); } /** * 比较两个日期的大小(精确到时间) * @param date1 * @param date2 * @return 返回值 (1,0,-1) * @throws Exception */ public static int compareTime(Date date1, Date date2) throws Exception{ if(date1 == null || date2 != null){ throw new Exception("比较日期不能为空"); } return date1.compareTo(date2); } public static void main(String[] args) throws Exception { } }
DateUtils日期转换工具
猜你喜欢
转载自blog.csdn.net/weixin_42231507/article/details/80898137
今日推荐
周排行