/** * @FileName: DateUtil.java * @Package com.asura.framework.util * * @author zhangshaobin * @created 2012-11-5 下午5:53:07 * * Copyright 2011-2015 asura */ package com.asura.framework.base.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.asura.framework.base.exception.BusinessException; /** * <p> * 日期工具类 * Deprecated:in favor of asura-commons DateCalculator/DateParser/DateFormatter * </p> * * <PRE> * <BR> 修改记录 * <BR>----------------------------------------------- * <BR> 修改日期 修改人 修改内容 * <PRE> * * @author zhangshaobin * @since 1.0 * @version 1.0 * * */ @Deprecated public class DateUtil { public enum IntervalUnit { MILLISECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, YEAR } private static final Map<String, ThreadLocal<SimpleDateFormat>> timestampFormatPool = new HashMap<String, ThreadLocal<SimpleDateFormat>>(); private static final Map<String, ThreadLocal<SimpleDateFormat>> dateFormatPool = new HashMap<String, ThreadLocal<SimpleDateFormat>>(); private static final Object timestampFormatLock = new Object(); private static final Object dateFormatLock = new Object(); private static String dateFormatPattern = "yyyy-MM-dd"; private static String timestampPattern = "yyyy-MM-dd HH:mm:ss"; private static SimpleDateFormat getDateFormat() { ThreadLocal<SimpleDateFormat> tl = dateFormatPool.get(dateFormatPattern); if (null == tl) { synchronized (dateFormatLock) { tl = dateFormatPool.get(dateFormatPattern); if (null == tl) { tl = new ThreadLocal<SimpleDateFormat>() { @Override protected synchronized SimpleDateFormat initialValue() { return new SimpleDateFormat(dateFormatPattern); } }; dateFormatPool.put(dateFormatPattern, tl); } } } return tl.get(); } private static SimpleDateFormat getDateFormat(final String dateFormatPattern) { ThreadLocal<SimpleDateFormat> tl = dateFormatPool.get(dateFormatPattern); if (null == tl) { synchronized (dateFormatLock) { tl = dateFormatPool.get(dateFormatPattern); if (null == tl) { tl = new ThreadLocal<SimpleDateFormat>() { @Override protected synchronized SimpleDateFormat initialValue() { return new SimpleDateFormat(dateFormatPattern); } }; dateFormatPool.put(dateFormatPattern, tl); } } } return tl.get(); } private static SimpleDateFormat getTimestampFormat() { ThreadLocal<SimpleDateFormat> tl = timestampFormatPool.get(timestampPattern); if (null == tl) { synchronized (timestampFormatLock) { tl = timestampFormatPool.get(timestampPattern); if (null == tl) { tl = new ThreadLocal<SimpleDateFormat>() { @Override protected synchronized SimpleDateFormat initialValue() { return new SimpleDateFormat(timestampPattern); } }; timestampFormatPool.put(timestampPattern, tl); } } } return tl.get(); } /** * 时间戳格式 */ // private static SimpleDateFormat timestampFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 日期格式 */ // private static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); /** * * 根据日期格式解析成对应的date * * @author zhangshaobin * @created 2015年7月16日 下午6:58:20 * * @param str * @param dateFormatPattern * @return * @throws ParseException */ public static Date parseDate(String str,String dateFormatPattern) throws ParseException { SimpleDateFormat sdf = getDateFormat(dateFormatPattern); Date d = sdf.parse(str); return d; } /** * * 格式化成时间戳格式 * * @author zhangshaobin * @created 2012-11-5 下午6:05:59 * * @param date 要格式化的日期 * @return "年年年年-月月-日日 时时:分分:秒秒"格式的日期字符串 */ public static String timestampFormat(final Date date) { if (date == null) { return ""; } // return timestampFormat.format(date); return getTimestampFormat().format(date); } /** * * 格式化成时间戳格式 * * @author zhangshaobin * @created 2012-11-5 下午6:14:18 * * @param datetime 要格式化的日期 * @return "年年年年-月月-日日 时时:分分:秒秒"格式的日期字符串 */ public static String timestampFormat(final long datetime) { // return timestampFormat.format(new Date(datetime)); return getTimestampFormat().format(new Date(datetime)); } /** * * 将"年年年年-月月-日日 时时:分分:秒秒"格式的日期字符串转换成Long型日期 * * @author zhangshaobin * @created 2012-11-5 下午6:23:28 * * @param timestampStr 年年年年-月月-日日 时时:分分:秒秒"格式的日期字符串 * @return Long型日期 */ public static long formatTimestampToLong(final String timestampStr) { Date date; try { // date = timestampFormat.parse(timestampStr); date = getTimestampFormat().parse(timestampStr); } catch (final ParseException e) { return 0L; } return date.getTime(); } /** * * 格式化成日期格式 * * @author zhangshaobin * @created 2012-11-5 下午6:10:42 * * @param date 要格式化的日期 * @return "年年年年-月月-日日"格式的日期字符串 */ public static String dateFormat(final Date date) { if (date == null) { return ""; } // return dateFormat.format(date); return getDateFormat().format(date); } /** * * 格式化成日期格式, 根据传过来的日志格式 * * @author zhangshaobin * @created 2015年7月10日 下午1:49:31 * * @param date * @param dateFormatPattern * @return */ public static String dateFormat(final Date date, String dateFormatPattern) { if (date == null) { return ""; } // return dateFormat.format(date); return getDateFormat(dateFormatPattern).format(date); } /** * * 格式化成日期格式 * * @author zhangshaobin * @created 2012-11-5 下午6:13:41 * * @param datetime 要格式化的日期 * @return "年年年年-月月-日日"格式的日期字符串 */ public static String dateFormat(final long datetime) { // return dateFormat.format(new Date(datetime)); return getDateFormat().format(new Date(datetime)); } /** * * 将"年年年年-月月-日日"格式的日期字符串转换成Long型日期 * * @author zhangshaobin * @created 2012-11-5 下午6:25:21 * * @param dateStr "年年年年-月月-日日"格式的日期字符串 * @return Long型日期 * @throws BusinessException 日期格式化异常 */ public static long formatDateToLong(final String dateStr) throws BusinessException { Date date; try { //date = dateFormat.parse(dateStr); date = getDateFormat().parse(dateStr); } catch (final ParseException e) { throw new BusinessException("将输入内容格式化成日期类型时出错。", e); } return date.getTime(); } /** * * 得到本月的第一天 * * @author zhangshaobin * @created 2012-11-5 下午6:33:43 * * @return 以"年年年年-月月-日日"格式返回当前月第一天的日期 */ public static String getFirstDayOfCurrentMonth() { final Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); // return dateFormat.format(calendar.getTime()); return getDateFormat().format(calendar.getTime()); } /** * * 得到月份第一天.以当前月份为基准 * * @author liushengqi * * @param offset * @return Date */ public static Date getFirstDayOfMonth(int offset) { final Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH,offset); calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); calendar.set(Calendar.HOUR_OF_DAY,0); calendar.set(Calendar.MINUTE,0); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); return calendar.getTime(); } /** * 得到下个月的第一秒 * @return */ public static Long getFirstMillSecondOfNextMonth(){ Date d = getFirstDayOfMonth(1); return d.getTime(); } /** * 得到下个月的最后一秒 * @return */ public static Long getLastMillSecondOfNextMonth(){ Date d = getLastDayOfMonth(1); return d.getTime()+24*3600*1000L-1000L; } /** * * 得到月份最后一天.以当前月份为基准 * * @author zhangshaobin * @created 2012-11-5 下午6:39:38 * * @return 以"年年年年-月月-日日"格式返回当前月最后一天的日期 */ public static Date getLastDayOfMonth(int offset) { final Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH,offset); calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); calendar.set(Calendar.HOUR_OF_DAY,0); calendar.set(Calendar.MINUTE,0); calendar.set(Calendar.SECOND,0); calendar.set(Calendar.MILLISECOND,0); return calendar.getTime(); } /** * * 得到本月的最后一天 * * @author zhangshaobin * @created 2012-11-5 下午6:39:38 * * @return 以"年年年年-月月-日日"格式返回当前月最后一天的日期 */ public static String getLastDayOfCurrentMonth() { final Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); // return dateFormat.format(calendar.getTime()); return getDateFormat().format(calendar.getTime()); } /** * * 获取指定日期所在月的第一天 * * @author zhangshaobin * @created 2012-11-5 下午6:45:07 * * @param date 日期 * @return 以"年年年年-月月-日日"格式返回当指定月第一天的日期 */ public static String getFirstDayOfMonth(final Date date) { final Calendar ca = Calendar.getInstance(); ca.setTime(date); ca.set(Calendar.DAY_OF_MONTH, 1); // return dateFormat.format(ca.getTime()); return getDateFormat().format(ca.getTime()); } /** * * 获取指定日期所在月的最后一天 * * @author zhangshaobin * @created 2012-11-5 下午7:04:10 * * @param date * @return 以"年年年年-月月-日日"格式返回当指定月最后一天的日期 */ public static String getLastDayOfMonth(final Date date) { final Calendar ca = Calendar.getInstance(); ca.setTime(date); ca.set(Calendar.DAY_OF_MONTH, 1); ca.roll(Calendar.DAY_OF_MONTH, -1); // return dateFormat.format(ca.getTime()); return getDateFormat().format(ca.getTime()); } /** * * 获取指定日期所在月的最后一天 * * @author zhangshaobin * @created 2012-11-5 下午7:04:10 * * @param date * @return 以"年年年年-月月-日日"格式返回当指定月最后一天的日期 */ public static Long getLastDayTimeOfMonth(final Date date) { final Calendar ca = Calendar.getInstance(); ca.setTime(date); ca.set(Calendar.DAY_OF_MONTH, 1); ca.roll(Calendar.DAY_OF_MONTH, -1); // return dateFormat.format(ca.getTime()); return ca.getTime().getTime(); } /** * * 获取指定日期所在周的第一天 * * @author zhangshaobin * @created 2012-12-4 下午6:45:07 * * @param date 日期 * @return 以"年年年年-月月-日日"格式返回当指定周第一天的日期 */ public static String getFirstDayOfWeek(final Date date) { final Calendar ca = Calendar.getInstance(); ca.setTime(date); ca.set(Calendar.DAY_OF_WEEK, 2); // return dateFormat.format(ca.getTime()); return getDateFormat().format(ca.getTime()); } /** * 获取当前日期所在周的周末 * @param date * @return */ private static Calendar lastDayOfWeek(final Date date){ final Calendar ca = Calendar.getInstance(); ca.setTime(date); //日期减去1防止是周日(国外周日为一周的第一天) ca.add(Calendar.DATE,-1); //设置为本周的周六,这里不能直接设置为周日,中国本周日和国外本周日不同 ca.set(Calendar.DAY_OF_WEEK,Calendar.SATURDAY); //日期往前推移一天 ca.add(Calendar.DATE,1); return ca; } /** * * 获取当前日期所在周的周末 * * @author zhangshaobin * @created 2012-12-4 下午7:04:10 * * @param date * @return 以"年年年年-月月-日日" */ public static String getLastDayOfWeek(final Date date) { final Calendar ca = lastDayOfWeek(date); return getDateFormat().format(ca.getTime()); } /** * 获取当前日期所在的周六 第一秒 * @param date * @return */ public static Long getSaturdayOfWeek(final Date date) { //周日零点零分零秒 final Calendar ca = lastDayOfWeek(date); ca.set(Calendar.HOUR_OF_DAY,0); ca.set(Calendar.MINUTE,0); ca.set(Calendar.SECOND,0); ca.set(Calendar.MILLISECOND,0); //日期减去1天 变为周六零时零分零秒 ca.add(Calendar.DATE,-1); return ca.getTime().getTime(); } /** * 获取当前日期所在的周日 最后一秒 * @param date * @return */ public static Long getLastSecondOfWeek(final Date date) { final Calendar ca = lastDayOfWeek(date); ca.set(Calendar.HOUR_OF_DAY, 0); ca.set(Calendar.MINUTE,0); ca.set(Calendar.SECOND,0); ca.set(Calendar.MILLISECOND,0); ca.add(Calendar.DATE,1); return ca.getTime().getTime()-1; } /** * * 获取当前日期的前一天 * * @author zhangshaobin * @created 2013-3-22 上午8:58:12 * * @return 以"年年年年-月月-日日"格式返回当前日期的前一天的日期 */ public static String getDayBeforeCurrentDate() { final Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, -1); // return dateFormat.format(calendar.getTime()); return getDateFormat().format(calendar.getTime()); } /** * * 获取指定日期的前一天 * * @author zhangshaobin * @created 2013-3-22 上午9:35:59 * * @param date * @return 以"年年年年-月月-日日"格式返回指定日期的前一天的日期 */ public static String getDayBeforeDate(final Date date) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DATE, -1); // return dateFormat.format(calendar.getTime()); return getDateFormat().format(calendar.getTime()); } /** * * 获取当前日期的后一天 * * @author zhangshaobin * @created 2013-3-22 上午9:44:36 * * @return 以"年年年年-月月-日日"格式返回当前日期的后一天的日期 */ public static String getDayAfterCurrentDate() { final Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.DATE, 1); // return dateFormat.format(calendar.getTime()); return getDateFormat().format(calendar.getTime()); } /** * * 获取当前日期的后一天 * * @author zhangshaobin * @created 2013-3-22 上午9:44:36 * * @return 以"年年年年-月月-日日"格式返回指定日期的后一天的日期 */ public static String getDayAfterDate(final Date date) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.DATE, 1); // return dateFormat.format(calendar.getTime()); return getDateFormat().format(calendar.getTime()); } /** * * 获取当前时间,精确到秒 * * @author zhangshaobin * @created 2013-1-24 下午4:40:19 * * @return 精确到秒的当前时间 */ public static int currentTimeSecond() { return Long.valueOf(System.currentTimeMillis() / 1000).intValue(); } /** * * 替换掉日期格式中所有分隔符(含“-”、“:”及空格) * * @author zhangshaobin * @created 2013-6-8 下午1:17:18 * * @param target 字符型目标日期 * @return 替换后的结果 */ public static String replaceAllSeparator(final String target) { return target.replace("-", "").replace(":", "").replace(" ", ""); } /** * * 替换掉日志格式中指定的分隔符 * * @author zhangshaobin * @created 2013-6-8 下午1:18:01 * * @param target 字符型目标日期 * @param separator 要被替换掉的分割符 * @return 替换后的结果 */ public static String replaceSeparator(final String target, final String... separator) { String temp = target; for (final String sep : separator) { temp = temp.replace(sep, ""); } return temp; } /** * * 根据步长获取时间 * * @author zhangshaobin * @created 2014年12月3日 上午10:41:45 * * @param interval 步长 ,正数获取将来时间, 负数获取以前的时间 * @param unit 步长单位, 年月周日时分秒 * @return */ public static Date intervalDate(final int interval, final IntervalUnit unit) { final Calendar c = Calendar.getInstance(); c.setTime(new Date()); c.setLenient(true); c.add(translate(unit), interval); return c.getTime(); } private static int translate(final IntervalUnit unit) { switch (unit) { case DAY: return Calendar.DAY_OF_YEAR; case HOUR: return Calendar.HOUR_OF_DAY; case MINUTE: return Calendar.MINUTE; case MONTH: return Calendar.MONTH; case SECOND: return Calendar.SECOND; case MILLISECOND: return Calendar.MILLISECOND; case WEEK: return Calendar.WEEK_OF_YEAR; case YEAR: return Calendar.YEAR; default: throw new IllegalArgumentException("Unknown IntervalUnit"); } } /** * 获取几天前或几天后的日期 * * @param day * 可为负数,为负数时代表获取之前的日期.为正数,代表获取之后的日期 * @return */ public static Date getTime(final int day) { return getTime(new Date(), day); } /** * 获取指定日期几天前或几天后的日期 * * @param date * 指定的日期 * @param day * 可为负数, 为负数时代表获取之前的日志.为正数,代表获取之后的日期 * @return */ public static Date getTime(final Date date, final int day) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day); return calendar.getTime(); } /** * 功能:判断字符串是否为日期格式 * * @param strDate * @return */ public static boolean isDate(String strDate) { Pattern pattern = Pattern.compile( "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$"); Matcher m = pattern.matcher(strDate); if (m.matches()) { return true; } else { return false; } } /** * * 获取小时之前的时间串 * * @author zhangshaobin * @created 2014年12月3日 上午10:41:45 * * @param hour 小时 * @return */ public static String getTimeStringOfHourBefore(int hour) { final Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.add(Calendar.HOUR, hour*-1); return getTimestampFormat().format(calendar.getTime()); } /** * * 获取两个日期之间的天数 * 例如:startDate=2016-04-03 endDate=2016-04-05 * 返回:2 * * @author zhangshaobin * @created 2016年4月3日 下午午17:41:45 * * @param startDate * @param endDate * @return */ public static int getDatebetweenOfDayNum(Date startDate, Date endDate ) { try { startDate = parseDate(getDateFormat().format(startDate.getTime()), dateFormatPattern); endDate = parseDate(getDateFormat().format(endDate.getTime()), dateFormatPattern); } catch (ParseException e) { e.printStackTrace(); } Calendar cal = Calendar.getInstance(); cal.setTime(startDate); long time1 = cal.getTimeInMillis(); cal.setTime(endDate); long time2 = cal.getTimeInMillis(); long between_days=(time2-time1)/(1000*3600*24); return Integer.parseInt(String.valueOf(between_days)); } /** * 获取两个日期间的区间日期 * 例如:startDate=2016-04-03 endDate=2016-04-05 * 返回:2016-04-03 2016-04-04 2016-04-05 集合 * * @author zhangshaobin * @created 2016年4月3日 下午午17:46:20 * * @param startDate * @param endDate * @return */ public static List<Date> getDatebetweenOfDays(Date startDate, Date endDate) { List<Date> list = new ArrayList<Date>(); GregorianCalendar gc1=new GregorianCalendar(),gc2=new GregorianCalendar(); gc1.setTime(startDate); gc2.setTime(endDate); do{ GregorianCalendar gc3=(GregorianCalendar)gc1.clone(); list.add(gc3.getTime()); System.out.println(gc3.getTime()); gc1.add(Calendar.DAY_OF_MONTH, 1); }while(!gc1.after(gc2)); return null; } public static void main(String []args) throws ParseException { Date d1 = parseDate("2016-04-03 15:20:00", timestampPattern); Date d2 = parseDate("2016-04-05 19:20:00", timestampPattern); System.out.println(getDatebetweenOfDayNum(d1 , d2)); getDatebetweenOfDays(d1, d2); } }