package com.raycloud.erp.performance.util; import org.apache.commons.lang.StringUtils; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.regex.Pattern; public class DateUtil { public static final String YMD_HMS = "yyyy-MM-dd HH:mm:ss"; public static final String YMD = "yyyy-MM-dd"; public static final String YM = "yyyy-MM"; public static final long ONE_DAY_MillIS = 24 * 60 * 60 * 1000; private static ThreadLocalthreadLocalDateFormat(final String pattern) { ThreadLocal tl = new ThreadLocal () { protected DateFormat initialValue() { return new SimpleDateFormat(pattern); } }; return tl; } private static Map > tlDateFormatMap = new ConcurrentHashMap >(); public static DateFormat getDateFormat(String fmt){ ThreadLocal tl = tlDateFormatMap.get(fmt); if(tl == null){ tl = threadLocalDateFormat(fmt); tlDateFormatMap.put(fmt, tl); } return tl.get(); } private static Map regPatternMap = new HashMap (); static { regPatternMap.put(Pattern.compile("^\\d{4}-\\d{1,2}-\\d{1,2}$"), "yyyy-MM-dd"); regPatternMap.put(Pattern.compile("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$"), "yyyy-MM-dd HH:mm:ss"); regPatternMap.put(Pattern.compile("^\\d{4}\\d{1,2}\\d{1,2}$"), "yyyyMMdd"); regPatternMap.put(Pattern.compile("^\\d{4}\\d{1,2}$"), "yyyyMM"); regPatternMap.put(Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2}$"), "yyyy/MM/dd"); regPatternMap.put(Pattern.compile("^\\d{4}年\\d{1,2}月\\d{1,2}日$"), "yyyy年MM月dd日"); regPatternMap.put(Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$"), "yyyy/MM/dd HH:mm:ss"); regPatternMap.put(Pattern.compile("^\\d{4}/\\d{1,2}/\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1}$"), "yyyy/MM/dd HH:mm:ss.S"); regPatternMap.put(Pattern.compile("^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1}$"), "yyyy-MM-dd HH:mm:ss.S"); } public static Date addMonth(Date date, int interval) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MONTH, interval); return calendar.getTime(); } public static Date decMonth(Date date, int interval) { return addMonth(date, -1 * interval); } public static Date addDay(Date date, int interval) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DAY_OF_MONTH, interval); return calendar.getTime(); } public static Date addHour(Date date, int interval) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.HOUR_OF_DAY, interval); return calendar.getTime(); } public static Date addMinute(Date date, int interval) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MINUTE, interval); return calendar.getTime(); } public static Date decDay(Date date, int interval) { return addDay(date, -1 * interval); } public static Date addSecond(Date date, int interval) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.SECOND, interval); return calendar.getTime(); } /** * 方法描述: 根据传入的时间,返回与之 年份/月份/日期/小时/分钟/秒 相距interval的时间 */ public static Date getDate(long millis, int fileds, int interval) { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(millis); calendar.add(fileds, interval); return calendar.getTime(); } public static Date convert(Long timestamp){ return new Date(timestamp); } /** * 方法描述:获取当前时间的 */ public static Date now() { return new Date(); } public static Long currentTimeMillis(){ return System.currentTimeMillis(); } /** * 方法描述:获取前一天的结束时间 */ public static Date getYesterdayNight() { Calendar c = Calendar.getInstance(); c.add(Calendar.DATE, -1); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } public static Date getYesterdayNight(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.DATE, -1); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } /** * 方法描述:获取当日的最晚时间 * * @author: guanfu.xie * @version: Dec 27, 2010 4:48:35 PM */ public static Date getDayNight(String dateStr, String pattern) { Date date = null; if (StringUtils.isNotEmpty(dateStr)) { try { SimpleDateFormat sdf = new SimpleDateFormat(pattern); date = sdf.parse(dateStr); Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); date = c.getTime(); } catch (ParseException e) { e.printStackTrace(); } } return date; } /** * 得到两个时间之间相差的天数 * * @param startDate * @param endDate * @return */ public static int getDaysBetween(Date startDate, Date endDate) { return (int) ((endDate.getTime() - startDate.getTime()) / ONE_DAY_MillIS); } /** * 方法描述:获取当日的最晚时间 */ public static Date getDayNight(Date dateTime) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); Date date = c.getTime(); return date; } /** * 方法描述: 距当前时间的 interval 天的晚上(23点59分59秒); */ public static Date getDayNight(Date dateTime, int interval) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); c.add(Calendar.DATE, interval); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); Date date = c.getTime(); return date; } /** * 方法描述:获取当日的最早时间 */ public static Date getDayMorning(String dateStr, String pattern) { Date date = null; if (StringUtils.isNotEmpty(dateStr)) { try { SimpleDateFormat sdf = new SimpleDateFormat(pattern); date = sdf.parse(dateStr); Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); date = c.getTime(); } catch (ParseException e) { e.printStackTrace(); } } return date; } /** * 方法描述:获取当日的最早时间 */ public static Date getDayMorning(Date dateTime) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); Date date = c.getTime(); return date; } /** * 方法描述:几天之前/后的早上(0点0分0秒) */ public static Date getDayMorning(Date dateTime, int interval) { Calendar c = Calendar.getInstance(); c.setTime(dateTime); c.add(Calendar.DATE, interval); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); Date date = c.getTime(); return date; } /** * 方法描述: date 在 firstHour 和 endHour点钟之间返回true */ public static boolean isNight(Date date, int firstHour, int endHour) { boolean flag = false; Calendar c = Calendar.getInstance(); c.setTime(date); int hour = c.get(Calendar.HOUR_OF_DAY); if (hour >= firstHour && hour <= endHour) { flag = true; } return flag; } /** * 方法描述:判断一个时间是否在某个时间段内 */ public static boolean isIn(Date date, Date startDate, Date endDate) { if (!date.before(startDate) && !date.after(endDate)) { return true; } else { return false; } } /** * 方法描述:对输入的时间换算为几时几分几秒几毫秒 */ public static String format2HMS(long duration) { long ms = duration % 1000; long s = duration / 1000; long m = s / 60; s = s % 60; long h = m / 60; m = m % 60; return h + "小时" + m + "分钟" + s + "秒" + ms + "毫秒"; } /** * 方法描述:格式化日期 */ public static String formatDate(Date d, String fmt) { return getDateFormat(fmt).format(d); } public static String formatYMD(Date d) { return getDateFormat(YMD).format(d); } public static String formatYMD_HMS(Date d) { return getDateFormat(YMD_HMS).format(d); } /** * 方法描述:格式化日期 */ public static String formatDate(Long date, String fmt) { return getDateFormat(fmt).format(date); } /** * 方法描述:该月的第一天 */ public static Date getMonthFirstDay(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.DAY_OF_MONTH, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTime(); } /** * 生成指定时期日期对象 * @return */ public static Date getDate(int year, int month, int day, int hour, int minite, int second) { Calendar calendar = Calendar.getInstance(); calendar.set(year, month, day, hour, minite, second); return calendar.getTime(); } /** * 获取当月已经经过的天数 * * @return */ public static int getCurrentMonthDays() { Calendar aCalendar = Calendar.getInstance(); aCalendar.setTime(getMonthFirstDay(now())); int day1 = aCalendar.get(Calendar.DAY_OF_YEAR); aCalendar.setTime(now()); int day2 = aCalendar.get(Calendar.DAY_OF_YEAR); return day2 - day1; } /** * 获取指定日期所在月份已经经过的天数 * * @return */ public static int getMonthDays(Date date) { Calendar aCalendar = Calendar.getInstance(); aCalendar.setTime(getMonthFirstDay(date)); int day1 = aCalendar.get(Calendar.DAY_OF_YEAR); aCalendar.setTime(date); int day2 = aCalendar.get(Calendar.DAY_OF_YEAR); return day2 - day1; } /** * 是否在同一个月 * * @param date1 * @param date2 * @return */ public static boolean isSameMonth(Date date1, Date date2) { DateFormat df = getDateFormat(YM); String month1 = df.format(date1); String month2 = df.format(date2); return month1.equals(month2); } /** * 方法描述:判断两个时间相差多少个月 * * @author: Think * @version: 2011-11-4 下午01:25:49 */ public static int monthDiff(Date gmtExpired, Date gmtCreate) { if (gmtCreate == null || gmtExpired == null) { return 0; } int day = dateDiff(gmtExpired, gmtCreate); int monthDiff = 0; double INIT_DAY = 30; if (day > 0) { monthDiff = (int) Math.ceil(day / INIT_DAY); } return monthDiff; } /** * 返回两个日期之间隔了多少天 * * @param date1 * @param date2 */ public static int dateDiff(Date date1, Date date2) { int i = (int) ((date1.getTime() - date2.getTime()) / 3600 / 24 / 1000); return i; } /** * 获取当月第一天的0点0分0秒 * * @return java.util.Date */ public static Date getMonthStart() { Calendar c = Calendar.getInstance(); c.set(Calendar.DAY_OF_MONTH, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); return c.getTime(); } public static int getDayOfMonth(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.get(Calendar.DAY_OF_MONTH); } public static Date getPatternDate(Date date, String pattern) { String dateString = formatDate(date, pattern); return parse(dateString, pattern); } /** * 重置日期的秒数为amount并返回 * * @param date * @param amount * @return */ public static Date setSeconds(Date date, int amount) { return set(date, Calendar.SECOND, amount); } /** * 重置日期的小时数为amount并返回 * * @param date * @param amount * @return */ public static Date setHours(Date date, int amount) { return set(date, Calendar.HOUR_OF_DAY, amount); } /** * 重置日期的天数为amount并返回 * * @param date * @param amount * @return */ public static Date setDays(Date date, int amount) { return set(date, Calendar.DAY_OF_MONTH, amount); } /** * 重置日期的月份为amount并返回 * * @param date * @param amount 从1开始 * @return */ public static Date setMonths(Date date, int amount) { return set(date, Calendar.MONTH, amount - 1); } /** * 重置日期的年份为amount并返回 * * @param date * @param amount 从1开始 * @return */ public static Date setYears(Date date, int amount) { return set(date, Calendar.YEAR, amount); } /** * 重围日期的 年份/月份/日期/小时/分钟/秒 为amount的时间 * * @param date 传入的时间 * @param fileds 年份/月份/日期/小时/分钟/秒 * @param value 间隔时间 * @return java.util.Date */ private static Date set(Date date, int fileds, int value) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(fileds, value); return calendar.getTime(); } public static String format(Date date, String fmt) { return getDateFormat(fmt).format(date); } public static Date parse(String date, String fmt) { try { return getDateFormat(fmt).parse(date); } catch (Exception e) { e.printStackTrace(); } return null; } public static Date parse(String date) { try { for (Map.Entry entry : regPatternMap.entrySet()) { boolean isMatch = entry.getKey().matcher(date).matches(); if (isMatch) { return getDateFormat(entry.getValue()).parse(date); } } } catch (ParseException e) { throw new IllegalArgumentException("can't support this pattern , date is " + date); } throw new IllegalArgumentException("can't support this pattern , date is " + date); } public static Date parseYMD(String date) { try { return getDateFormat(YMD).parse(date); } catch (ParseException e) { e.printStackTrace(); } return null; } public static Date parseYMD_HMS(String date) { try { return getDateFormat(YMD_HMS).parse(date); } catch (ParseException e) { throw new IllegalArgumentException("the date pattern is error!"); } } /** * 是否是同一天 * * @param date * @param date2 * @return */ public static boolean isSameDay(Date date, Date date2) { if (date == null || date2 == null) { return false; } DateFormat df = getDateFormat(YMD); return df.format(date).equals(df.format(date2)); } public static int getHour(Date date) { String hour = getDateFormat("HH").format(date); return Integer.valueOf(hour); } public static Date clone(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.getTime(); } public static Date getMaxDate(Date date1, Date date2) { if (date1.after(date2)) { return date1; } else { return date2; } } public static Date getMinDate(Date date1, Date date2) { if (date1.after(date2)) { return date2; } else { return date1; } } /** * 根据传入的日期,返回当日最晚时间,形如2013-10-10 23:59:59 * * @param date 日期 * @return java.util.Date */ public static Date getDateEnd(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } /** * 获取传入日期的最早时间,形如2013-10-10 00:00:00 * * @param date 传入日期 * @return java.util.Date */ public static Date getDateStart(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } public static Date getDateStart(Date date,int days) { date=addDay(date,days); Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } /** * 获取给定日期所在月份的第一天的0点0分0秒 * * @param date 给定日期 * @return java.util.Date */ public static Date getMonthStart(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.DAY_OF_MONTH, 1); c.set(Calendar.HOUR_OF_DAY, 0); c.set(Calendar.MINUTE, 0); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); return c.getTime(); } /** * 获取给定日期所在月份的第一天的0点0分0秒 * * @param date 给定日期 * @return java.util.Date */ public static Date getMonthEnd(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); c.set(Calendar.HOUR_OF_DAY, 23); c.set(Calendar.MINUTE, 59); c.set(Calendar.SECOND, 59); return c.getTime(); } /** * yyyy-MM-dd_HH:mm:ss * * @return */ public static String toUnderlinedString(Date date) { return formatYMD_HMS(date).replace(' ', '_'); } public static String removeTime(String datetime) { return datetime.substring(0, 10); } }
Java 时间工具类
- 2022-01-13
- Admin
原文:https://blog.csdn.net/long198861/article/details/122467422
ERP
联系站长
QQ:769220720