package io.mycat.route.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.Locale; import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.time.DateUtils; /** * * @author yan.yan@huawei.com */ public final class DateUtil extends DateUtils { /** yyyyMMdd */ public final static String SHORT_FORMAT = "yyyyMMdd"; /** yyyyMMddHHmmss */ public final static String LONG_FORMAT = "yyyyMMddHHmmss"; /** yyyy-MM-dd */ public final static String WEB_FORMAT = "yyyy-MM-dd"; /** HHmmss */ public final static String TIME_FORMAT = "HHmmss"; /** yyyyMM */ public final static String MONTH_FORMAT = "yyyyMM"; /** yyyy年MM月dd�? */ public final static String CHINA_FORMAT = "yyyy年MM月dd日"; /** yyyy-MM-dd HH:mm:ss */ public final static String LONG_WEB_FORMAT = "yyyy-MM-dd HH:mm:ss"; /** yyyy-MM-dd HH:mm */ public final static String LONG_WEB_FORMAT_NO_SEC = "yyyy-MM-dd HH:mm"; /** * 日期对象解析成日期字符串基础方法,可以据此封装出多种便捷的方法直接使用 * * @param date 待格式化的日期对 * @param format 输出的格式 * @return 格式化的字符 */ public static String format(Date date, String format) { if (date == null || StringUtil.isBlank(format)) { return StringUtil.EMPTY; } return new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE).format(date); } /** * 格式化当前时间 * * @param format 输出的格式 * @return */ public static String formatCurrent(String format) { if (StringUtil.isBlank(format)) { return StringUtil.EMPTY; } return format(new Date(), format); } /** * 日期字符串解析成日期对象基础方法,可以在此封装出多种便捷的方法直接使用 * * @param dateStr 日期字符 * @param format 输入的格式 * @return 日期对象 * @throws ParseException */ public static Date parse(String dateStr, String format) throws ParseException { if (StringUtil.isBlank(format)) { throw new ParseException("format can not be null.", 0); } if (dateStr == null || dateStr.length() < format.length()) { throw new ParseException("date string's length is too small.", 0); } return new SimpleDateFormat(format, Locale.SIMPLIFIED_CHINESE).parse(dateStr); } /** * 日期字符串格式化基础方法,可以在此封装出多种便捷的方法直接使�? * * @param dateStr 日期字符 * @param formatIn 输入的日期字符串的格式 * @param formatOut 输出日期字符串的格式 * @return 已经格式化的字符 * @throws ParseException */ public static String format(String dateStr, String formatIn, String formatOut) throws ParseException { Date date = parse(dateStr, formatIn); return format(date, formatOut); } /** * 把日期对象按<code>yyyyMMdd</code>格式解析成字符串 * * @param date 待格式化的日期对 * @return 格式化的字符串 */ public static String formatShort(Date date) { return format(date, SHORT_FORMAT); } /** * 把日期字符串按照<code>yyyyMMdd</code>格式,进行格式化 * * @param dateStr 待格式化的日期字符串 * @param formatIn 输入的日期字符串的格式 * @return 格式化的字符 */ public static String formatShort(String dateStr, String formatIn) throws ParseException { return format(dateStr, formatIn, SHORT_FORMAT); } /** * 把日期对象按<code>yyyy-MM-dd</code>格式解析成字符串 * * @param date 待格式化的日期对 * @return 格式化的字符 */ public static String formatWeb(Date date) { return format(date, WEB_FORMAT); } /** * 把日期字符串按照<code>yyyy-MM-dd</code>格式,进行格式化 * * @param dateStr 待格式化的日期字符串 * @param formatIn 输入的日期字符串的格式 * @return 格式化的字符 * @throws ParseException */ public static String formatWeb(String dateStr, String formatIn) throws ParseException { return format(dateStr, formatIn, WEB_FORMAT); } /** * 把日期对象按<code>yyyyMM</code>格式解析成字符串 * * @param date 待格式化的日期对 * @return 格式化的字符 */ public static String formatMonth(Date date) { return format(date, MONTH_FORMAT); } /** * 把日期对象按<code>HHmmss</code>格式解析成字符串 * * @param date 待格式化的日期对 * @return 格式化的字符 */ public static String formatTime(Date date) { return format(date, TIME_FORMAT); } /** * 获取yyyyMMddHHmmss+n位随机数格式的时间戳 * * @param n 随机数位 * @return */ public static String getTimestamp(int n) { return formatCurrent(LONG_FORMAT) + RandomStringUtils.randomNumeric(n); } /** * 根据日期格式返回昨日日期 * * @param format 日期格式 * @return */ public static String getYesterdayDate(String format) { return getDateCompareToday(format, -1, 0); } /** * 把当日日期作为基准,按照格式返回相差定间隔的日期 * * @param format 日期格式 * @param daysAfter 和当日比相差几天,例如3代表3天后,-1代表1天前 * @param monthAfter 和当日比相差几月,例如2代表2月后,-3代表3月前 * @return */ public static String getDateCompareToday(String format, int daysAfter, int monthAfter) { Calendar today = Calendar.getInstance(); if (daysAfter != 0) { today.add(Calendar.DATE, daysAfter); } if (monthAfter != 0) { today.add(Calendar.MONTH, monthAfter); } return format(today.getTime(), format); } /** * 根据日期格式返回上月的日期 * * @param format * @return */ public static String getLastMonth(String format) { Calendar today = Calendar.getInstance(); today.add(Calendar.MONTH, -1); return format(today.getTime(), format); } /** * 平移当前时间,以分为单元,minutes * * @param minutes * @return */ public static Date addCurMin(long minutes) { return DateUtils.addMinutes(new Date(), (int) minutes); } /** * 平移当前时间,以秒为单元,minutes * * @param secs * @return */ public static Date addCurSeconds(long secs) { return addSeconds(new Date(), (int) secs); } }