所有工具類
日期工具類
源碼如下:
package zj.date.util; import java.io.File; import java.io.Serializable; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Logger; import zj.cache.util.EhCacheUtil; import zj.common.exception.ServiceException; import zj.date.bean.TradeDate; import zj.io.util.FileUtil; import zj.java.util.JavaUtil; import zj.reflect.util.TypeUtil; /** * * 日期工具類 * * @version 1.00 (2014.09.15) * @author SHNKCS 張軍 {@link <a href=http://user.qzone.qq.com/360901061/>張軍QQ空間</a>} * */ public class DateUtil implements Serializable { private static final long serialVersionUID = 1L; private transient static final Logger log = Logger.getLogger(DateUtil.class); public static final String EHCACHE_HOLIDAY_DATE = "holidayDate"; // =====================================================交易日====================================== // DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); // String value = "'" + formatter.format(new Date()) + "'"; // System.out.println(value); // /** // * 初使化節(jié)假日數(shù)據(jù) // * // * @param conn // * 數(shù)據(jù)庫(kù)連接 // * @return // */ // public static void cacheHoliday(Connection conn) { // Map<String, String> holidayMap = new HashMap<String, String>(); // PreparedStatement psQuery = null; // ResultSet rs = null; // try { // String sql = "select date_format(a.c_date,'%Y%m%d') c_date,a.c_desc from dc_trade_date a where a.is_trade_date=2"; // psQuery = conn.prepareStatement(sql); // rs = psQuery.executeQuery(); // while (rs.next()) { // holidayMap.put(rs.getString(1), rs.getString(2)); // } // EhCacheUtil.put(Constant.EHCACHE_HOLIDAY_DATE, holidayMap); // logger.info("緩存節(jié)假日數(shù)據(jù)成功:" + holidayMap.size()); // } catch (Exception e) { // throw new ServiceException(e); // } finally { // JdbcUtil.closeDB(rs, psQuery); // } // } /** * 取交易日[不包含當(dāng)前日期] * * @param td * 參數(shù)信息 * @return */ public static final Date tradeDate(TradeDate td) { Map<String, String> holidayMap = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); if (holidayMap == null || holidayMap.size() == 0) { throw new ServiceException("未初使化交易日文件,請(qǐng)執(zhí)行DateUtil.initTradeDate(file)"); } /** 當(dāng)前日期 **/ Date current = td.current; /** 遞歸次數(shù) **/ int recursionCount = td.recursionCount; /** 當(dāng)前日期前后,默認(rèn)前 **/ boolean beforeCurrent = td.beforeCurrent; /** 交易日前后,默認(rèn)前 **/ boolean beforeTradeDate = td.beforeTradeDate; /** 類型[默認(rèn)0:天,1:周,2:月,3:季度,4:年] **/ int type = td.type; // 首先取上一個(gè)日期 if (type == 3) { // 加減3個(gè)月 current = DateUtil.addMonth(current, beforeCurrent ? -3 : 3); } else { // 加減1天 current = DateUtil.addDay(current, beforeCurrent ? -1 : 1); } int addDay = beforeTradeDate ? -1 : 1; // 加一天 while (holidayMap.containsKey(DateUtil.dateParse(current, "yyyyMMdd"))) { // 是否是節(jié)假日 current = DateUtil.addDay(current, addDay); } if (recursionCount <= 1) { return current; } else { td.current = current; td.recursionCount = td.recursionCount - 1; return tradeDate(td); } } /** * 是否是交易日 * * @param current * 日期 * @return */ public static final boolean isTradeDate(Date current) { Map<String, String> holidayMap = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); if (holidayMap.containsKey(DateUtil.dateParse(current, "yyyyMMdd"))) { return false; } return true; } /** * 初使化交易日數(shù)據(jù) * * @param holidayMap * 交易日數(shù)據(jù) */ public static final void initTradeDate(Map<String, String> holidayMap) { EhCacheUtil.put(EHCACHE_HOLIDAY_DATE, holidayMap); } /** * 初使化交易日數(shù)據(jù) * * @param tradeDateFilePath * 交易日文件 */ public static final void initTradeDate(String tradeDateFilePath) { try { // 測(cè)試股票 // System.out.println(DateUtil.class.getResource("/trade_dates.txt").getPath()); // String file = "/versionManager/sources/java/zj-model/integration/tools/src/main/resources/trade_dates.txt"; Set<String> holidays = new HashSet<String>(); Map<String, String> holidayMap = new HashMap<String, String>(); FileUtil.readLines(holidays, new File(tradeDateFilePath)); for (String v : holidays) { String[] vs = JavaUtil.split(v, "\t"); if (vs.length == 2) { // System.out.println(vs[0] + ":" + vs[1]); holidayMap.put(vs[0], vs[1]); } } EhCacheUtil.put(EHCACHE_HOLIDAY_DATE, holidayMap); } catch (Exception e) { log.error("初使化交易日錯(cuò)誤"); } } /** * 取交易日 * * @param current * 日期 * @return */ @Deprecated public static final Date preTradeDate(Date current) { return preTradeDate(current, 1, true); } /** * 取交易日 * * @param current * 日期 * @return */ @Deprecated public static final Date preTradeDate(Date current, int tDay) { return preTradeDate(current, tDay, true); } /** * 取交易日 * * @param current * 日期 * @return */ @Deprecated public static final Date preTradeDate(Date current, int tDay, boolean before) { Map<String, String> holidayMap = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); if (holidayMap == null || holidayMap.size() == 0) { throw new ServiceException("未初使化交易日文件,請(qǐng)執(zhí)行DateUtil.initTradeDate(file)"); } // 首先取上一個(gè)日期 int addDay = before ? -1 : 1; current = DateUtil.addDay(current, addDay); // 加一天 while (holidayMap.containsKey(DateUtil.dateParse(current, "yyyyMMdd"))) { // 是否是節(jié)假日 current = DateUtil.addDay(current, addDay); } if (tDay <= 1) { return current; } else { return preTradeDate(current, tDay - 1, before); } } /** * 獲取交易日集合 * * @param sdate * 日期 * @param preDays * 向前取多少天 * @param diffDays * 相差多少天 * @author zhangjun * @return */ public static List<String> getTradeDates(String sdate, int preDays, int diffDays) { List<String> rdates = new ArrayList<String>(); try { Date date = DateUtil.parseDate(sdate); Map<String, String> holidayDate = EhCacheUtil.get(EHCACHE_HOLIDAY_DATE); // 相差天數(shù) diffDays = diffDays <= 0 ? -1 : -(diffDays + 1); // 總交易日 int totalDays = -diffDays * preDays; // 相隔日期 List<String> dates = new ArrayList<String>(); loop: while (true) { while (true) { // 判斷是否是節(jié)假日 if (!holidayDate.containsKey(DateUtil.dateParse(date, "yyyyMMdd"))) { // 添加交易日 dates.add(DateUtil.dateParse(date, "yyyy-MM-dd")); // 總天數(shù)減1 totalDays--; if (totalDays <= 0) { // 循環(huán)結(jié)束后-1 break loop; } } date = DateUtil.addDay(date, -1); } } // 真實(shí)的交易日 for (int i = 0; i < dates.size(); i = i - diffDays) { rdates.add(dates.get(i)); } // logger.info("-------待計(jì)算的所有交易日------------\n" + dates.size() + ":" + dates); // logger.info("-------計(jì)算相隔后的所有交易日------------\n" + rdates.size() + ":" + rdates); } catch (Exception e) { throw new ServiceException(e); } return rdates; } // =====================================================交易日====================================== /** * 日期類型 * * @author zhangjun * */ public static class DateType implements Serializable { private static final long serialVersionUID = 1L; public static int DATE_TYPE_ALL = 0; public static int DATE_TYPE_y4 = 1; public static int DATE_TYPE_y4_MM = 2; public static int DATE_TYPE_y4_MM_dd = 3; public static int DATE_TYPE_y4_MM_dd_HH = 4; public static int DATE_TYPE_y4_MM_dd_HH_mm = 5; public static int DATE_TYPE_y4_MM_dd_HH_mm_ss = 6; public static int RANGE_TYPE_y = 0; public static int RANGE_TYPE_M = 1; public static int RANGE_TYPE_d = 2; public static int RANGE_TYPE_H = 3; public static int RANGE_TYPE_m = 4; public static int RANGE_TYPE_s = 5; } /** * 獲取星期幾 * * @param w * 星期標(biāo)識(shí)0-6=>周日-日六 * @return */ public static final String getDescWeekday(int w) { switch (w) { case 1: return "星期一"; case 2: return "星期二"; case 3: return "星期三"; case 4: return "星期四"; case 5: return "星期五"; case 6: return "星期六"; case 7: return "星期日"; default: return ""; } } /** * 獲取星期幾 * * @param w * 星期標(biāo)識(shí)0-6=>周日-周六 * @return */ public static final String getDescWeekday(String w) { return getDescWeekday(TypeUtil.Primitive.intValue(w)); } /** * 字符串轉(zhuǎn)日期 * * @param dt * 日期字符串 * @return 日期對(duì)象 */ public static Date parseDate(String dt) { return parseDate(dt, DateType.DATE_TYPE_ALL); } /** * 字符串轉(zhuǎn)日期 * * @param dt * 日期字符串 * @param dateType * 日期類型 * @see DateType * @return 日期對(duì)象 */ public static Date parseDate(String dt, int dateType) { Date rd = null; try { if (dt == null || dt == "") { log.warn("日期不能為:" + dt); } else { boolean isFail = false; String _val_format = "【" + dt + "】不是一個(gè)有效的日期格式\n支持日期格式如下:\n"; if (dateType == DateType.DATE_TYPE_y4) { _val_format += "【yyyy】"; } else if (dateType == DateType.DATE_TYPE_y4_MM) { _val_format += "【yyyyMM或yyyy-MM或yyyy/MM或yyyy MM】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd) { _val_format += "【yyyyMMdd或yyyy-MM-dd或yyyy/MM/dd或yyyy MM dd】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH) { _val_format += "【yyyyMMddhh或yyyy-MM-dd hh或yyyy/MM/dd hh或yyyy MM dd hh】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm) { _val_format += "【yyyyMMddhhmm或yyyy-MM-dd hh:mm或yyyy/MM/dd hh:mm或yyyy MM dd hh:mm】"; } else if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm_ss) { _val_format += "【yyyyMMddhhmmss或yyyy-MM-dd hh:mm:ss或yyyy/MM/dd hh:mm:ss或yyyy MM dd hh:mm:ss】"; } else { dateType = DateType.DATE_TYPE_ALL; _val_format += "【yyyy】"; _val_format += "【yyyyMM或yyyy-MM或yyyy/MM或yyyy MM】"; _val_format += "【yyyyMMdd或yyyy-MM-dd或yyyy/MM/dd或yyyy MM dd】"; _val_format += "【yyyyMMddhh或yyyy-MM-dd hh或yyyy/MM/dd hh或yyyy MM dd hh】"; _val_format += "【yyyyMMddhhmm或yyyy-MM-dd hh:mm或yyyy/MM/dd hh:mm或yyyy MM dd hh:mm】"; _val_format += "【yyyyMMddhhmmss或yyyy-MM-dd hh:mm:ss或yyyy/MM/dd hh:mm:ss或yyyy MM dd hh:mm:ss】"; } String datePat = ""; datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)([0-9]{1,2}) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})$"; Matcher mt = Pattern.compile(datePat).matcher(dt); String year = ""; String month = ""; String day = ""; String hour = ""; String minute = ""; String second = ""; if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm_ss || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = mt.group(6); minute = mt.group(7); second = mt.group(8); } else { isFail = true; } } else { datePat = "^(\\d{14})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm_ss || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = dt.substring(8, 10); minute = dt.substring(10, 12); second = dt.substring(12, 14); } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)(\\d{1,2}) (\\d{1,2}):(\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = mt.group(6); minute = mt.group(7); second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{12})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH_mm || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = dt.substring(8, 10); minute = dt.substring(10, 12); second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)(\\d{1,2}) (\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = mt.group(6); minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{10})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd_HH || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = dt.substring(8, 10); minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})(\\2)(\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = mt.group(5); hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{8})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM_dd || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = dt.substring(6, 8); hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})(/|-| )(\\d{1,2})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = mt.group(3); day = "1"; hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{6})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4_MM || dateType == DateType.DATE_TYPE_ALL) { year = dt.substring(0, 4); month = dt.substring(4, 6); day = "1"; hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { datePat = "^(\\d{4})$"; mt = Pattern.compile(datePat).matcher(dt); if (mt.find()) { if (dateType == DateType.DATE_TYPE_y4 || dateType == DateType.DATE_TYPE_ALL) { year = mt.group(1); month = "1"; day = "1"; hour = "0"; minute = "0"; second = "0"; } else { isFail = true; } } else { _val_format = "【" + dt + "】不是一個(gè)有效的日期格式"; isFail = true; } } } } } } } } } } } if (isFail) { log.warn(_val_format); } else { int iyear = Integer.parseInt(year); int imonth = Integer.parseInt(month); int iday = Integer.parseInt(day); int ihour = Integer.parseInt(hour); int iminute = Integer.parseInt(minute); int isecond = Integer.parseInt(second); if (iyear < 1 || iyear > 9999) { _val_format = "年份必須在0001-9999之間"; isFail = true; } if (imonth < 1 || imonth > 12) { _val_format = "月份必須在01-12之間"; isFail = true; } if (iday < 1 || iday > 31) { _val_format = "天數(shù)必須在01-31之間"; isFail = true; } if ((imonth == 4 || imonth == 6 || imonth == 9 || imonth == 11) && iday == 31) { _val_format = month + "月不能有31天!"; isFail = true; } if (imonth == 2) { boolean isleap = (iyear % 4 == 0 && iyear % 100 != 0) || iyear % 400 == 0; if (isleap) { if (iday > 29) { _val_format = "閏年[" + year + "]年的2月不能有[" + day + "]天!"; isFail = true; } } else { if (iday > 28) { _val_format = "平年[" + year + "]年的2月不能有[" + day + "]天!"; isFail = true; } } } if (ihour < 0 || ihour > 23) { _val_format = "小時(shí)必須在00-23之間"; isFail = true; } if (iminute < 0 || iminute > 59) { _val_format = "分鐘必須在00-59之間"; isFail = true; } if (isecond < 0 || isecond > 59) { _val_format = "秒鐘必須在00-59之間"; isFail = true; } if (isFail) { log.warn(_val_format); } else { // //("調(diào)試字符串如下【開(kāi)始】\n" + sb.toString() + "\n調(diào)試字符串如下【結(jié)束】"); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(0); calendar.set(iyear, imonth - 1, iday, ihour, iminute, isecond); rd = calendar.getTime(); } } } } catch (Exception e) { rd = null; log.error(e.getMessage()); } return rd; } /** * 日期解析字符串 * * @param odt * 日期對(duì)象 * @return 返回格式化后的日期字符串,如果出錯(cuò)返回當(dāng)前日期對(duì)象 */ public static String dateParse(Object odt) { return dateParse(odt, null); } /** * 日期解析字符串 * * @param odt * 日期對(duì)象 * @param partten * 日期格式 * <p> * yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(0-6=>周日-周六)w x q季度 * </p> * @return 返回格式化后的日期字符串,如果出錯(cuò)返回當(dāng)前日期對(duì)象 */ public static String dateParse(Object odt, String partten) { try { if (odt == null) return ""; Date dt = null; if (odt instanceof Date) { dt = (Date) odt; } else if (odt instanceof Timestamp) { Timestamp ts = (Timestamp) odt; dt = new Date(ts.getTime()); } else if (odt instanceof Calendar) { Calendar cal = (Calendar) odt; dt = cal.getTime(); } else if (odt instanceof String) { dt = parseDate(String.valueOf(odt)); if (dt == null) { log.error("無(wú)效的日期:" + odt); return ""; } } else { log.error("無(wú)效的日期:" + odt); return String.valueOf(odt); } return getParseDt(dt, partten); } catch (Exception e) { log.error(e.getMessage()); return String.valueOf(odt); } } /** * 日期解析字符串 * * @param dt * 日期對(duì)象 * @param partten * 日期格式 * <p> * yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(0-6=>周日-周六)w x q季度 * </p> * @return 返回格式化后的日期字符串,如果出錯(cuò)返回當(dāng)前日期對(duì)象 */ public static String getParseDt(Date dt, String partten) { if (dt == null) return ""; if (partten == null || "".equals(partten)) { partten="yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(0-6=>周日-周六)w x q季度"; } Calendar cal = Calendar.getInstance(); cal.setTime(dt); String year = "" + cal.get(Calendar.YEAR); String month = "" + (cal.get(Calendar.MONTH) + 1); String day = "" + cal.get(Calendar.DATE); String hour = "" + cal.get(Calendar.HOUR_OF_DAY); String minute = "" + cal.get(Calendar.MINUTE); String second = "" + cal.get(Calendar.SECOND); String millisecond = "" + cal.get(Calendar.MILLISECOND); // 星期標(biāo)識(shí)【0-6=>周日-周六】=>返回【1-7=>周一-周日】 int week_of_month = cal.get(Calendar.DAY_OF_WEEK) - 1; // 星期值 String ws = ""; switch (week_of_month) { case 1: ws += "1"; break; case 2: ws += "2"; break; case 3: ws += "3"; break; case 4: ws += "4"; break; case 5: ws += "5"; break; case 6: ws += "6"; break; case 0: ws += "7"; break; default: ws = ""; break; } // 上下午 int r = cal.get(Calendar.AM_PM); String ap = ""; if (r == Calendar.AM) { ap = "上午"; } if (r == Calendar.PM) { ap = "下午"; } // 季度值 int tempMonth = TypeUtil.Primitive.intValue(month); // quarter季度 String q = ""; if (tempMonth >= 1 && tempMonth <= 3) { q = "1"; } else if (tempMonth >= 4 && tempMonth <= 6) { q = "2"; } else if (tempMonth >= 7 && tempMonth <= 9) { q = "3"; } else if (tempMonth >= 10 && tempMonth <= 12) { q = "4"; } String matStr = ""; // 替換4位年 matStr = "(y|Y){4}"; Matcher mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(year, "0", 4)); // 替換2位月 matStr = "M{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(month, "0", 2)); // 替換季度 matStr = "(q|Q)"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(q); // 替換2位天 matStr = "d{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(day, "0", 2)); // 替換2位小時(shí) matStr = "(h|H){2}(24)?"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(hour, "0", 2)); // 替換2位分 matStr = "m{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(minute, "0", 2)); // 替換2位秒 matStr = "s{2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(second, "0", 2)); // 替換3位毫秒 matStr = "S{3}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR(millisecond, "0", 3)); // 替換星期 matStr = "w|W"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(ws); // 替換星期 matStr = "x|X"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(getDescWeekday(ws)); // 替換上下午 matStr = "p|P"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(ap); // 替換2位年 matStr = "(y|Y){2}"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(year.length() > 2 ? year.substring(year.length() - 2, year.length()) : year); // 替換1位月 matStr = "M"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(month); // 替換1位天 matStr = "d"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(day); // 替換1位小時(shí) matStr = "(h|H){1}(12)?"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(addForLR((Integer.parseInt(hour) > 12 ? "" + Math.abs(Integer.parseInt(hour) - 12) : hour), "0", 2)); // matStr = "(h|H)12"; // mt = Pattern.compile(matStr).matcher(partten); // partten = mt.replaceAll(Integer.parseInt(hour) > 12 ? "" + Math.abs(Integer.parseInt(hour) - 12) : hour); // matStr = "(h|H)24"; // mt = Pattern.compile(matStr).matcher(partten); // partten = mt.replaceAll(hour); // 替換1位分 matStr = "m"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(minute); // 替換1位秒 matStr = "s"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(second); // 替換1位毫秒 matStr = "S"; mt = Pattern.compile(matStr).matcher(partten); partten = mt.replaceAll(millisecond); // 最終結(jié)果 return partten; } /** * 數(shù)字前補(bǔ)0可以補(bǔ)"0"也可以補(bǔ)"" * * @param oldStr * 舊字符串 * @param addStr * 添加字符串 * @param strLength * 字符長(zhǎng)度 * @param isLeft * <p> * true:左補(bǔ)字符 * </p> * <p> * false:右補(bǔ)字符 * </p> * @return 重組后的數(shù)據(jù) */ public static String addForLR(String oldStr, String addStr, int strLength, boolean isLeft) { if (oldStr == null || addStr == null) return oldStr; int strLen = oldStr.length(); if (strLen < strLength) { while (strLen < strLength) { StringBuffer sb = new StringBuffer(); if (isLeft) { sb.append(addStr).append(oldStr); } else { sb.append(oldStr).append(addStr); } oldStr = sb.toString(); strLen = oldStr.length(); } } return oldStr; } /** * 數(shù)字前補(bǔ)0可以補(bǔ)"0"也可以補(bǔ)"" * * @param oldStr * 舊字符串 * @param addStr * 添加字符串 * @param strLength * 字符長(zhǎng)度 * @return 重組后的數(shù)據(jù) */ public static String addForLR(String oldStr, String addStr, int strLength) { return addForLR(oldStr, addStr, strLength, true); } /** * 計(jì)算日期范圍 * * @param startTime * 開(kāi)始日期對(duì)象 * @param endTime * 結(jié)束日期對(duì)象 * @param rangeType * 范圍類型 * @param ymdhms * 年月日時(shí)分秒 * @param dateType * 日期類型 */ public static String dateRangeFlg(Object startTime, Object endTime, int rangeType, int ymdhms, int dateType) { String sstartTime = startTime == null ? "" : String.valueOf(startTime); String sendTime = endTime == null ? "" : String.valueOf(endTime); String rtn_1 = "1"; String rtn_2 = "2"; String rtn_3 = "3"; String rtn_4 = "4"; String rtn_5 = "5"; String rtn_6 = "6"; try { if ("".equals(sstartTime)) { return rtn_4; } if ("".equals(sendTime)) { return rtn_5; } Date checktime1 = null; Date checktime2 = null; if (startTime instanceof Date) { checktime1 = (Date) startTime; } else { checktime1 = parseDate(sstartTime, dateType); } if (checktime1 == null) { return rtn_4; } if (endTime instanceof Date) { checktime2 = (Date) endTime; } else { checktime2 = parseDate(sendTime, dateType); } if (checktime2 == null) { return rtn_5; } if (startTime == "" || endTime == "") return ""; Calendar cal1 = Calendar.getInstance(); cal1.setTimeInMillis(0); cal1.setTime(checktime1); Calendar cal2 = Calendar.getInstance(); cal2.setTimeInMillis(0); cal2.setTime(checktime2); long flg = cal2.getTimeInMillis() - cal1.getTimeInMillis(); if (flg < 0) { // //("開(kāi)始時(shí)間不能大于結(jié)束時(shí)間!"); return rtn_6; } if (rangeType == DateType.RANGE_TYPE_y) { cal1.set(Calendar.YEAR, cal1.get(Calendar.YEAR) + ymdhms); // v_typeMsg = "年"; } else if (rangeType == DateType.RANGE_TYPE_M) { cal1.set(Calendar.MONTH, cal1.get(Calendar.MONTH) + ymdhms); // v_typeMsg = "個(gè)月"; } else if (rangeType == DateType.RANGE_TYPE_d) { cal1.set(Calendar.DATE, cal1.get(Calendar.DATE) + ymdhms); // v_typeMsg = "天"; } else if (rangeType == DateType.RANGE_TYPE_H) { cal1.set(Calendar.HOUR_OF_DAY, cal1.get(Calendar.HOUR_OF_DAY) + ymdhms); // v_typeMsg = "小時(shí)"; } else if (rangeType == DateType.RANGE_TYPE_m) { cal1.set(Calendar.MINUTE, cal1.get(Calendar.MINUTE) + ymdhms); // v_typeMsg = "分鐘"; } else if (rangeType == DateType.RANGE_TYPE_s) { cal1.set(Calendar.SECOND, cal1.get(Calendar.SECOND) + ymdhms); // v_typeMsg = "秒鐘"; } else { // //("類型值不正確,請(qǐng)看下面提示\ny:年,m1:月,d:日,h:時(shí),m2:分,s:秒"); return rtn_3; } flg = cal2.getTimeInMillis() - cal1.getTimeInMillis(); if (flg > 0) { // //("開(kāi)始時(shí)間和結(jié)束時(shí)間相差不能超過(guò)" + ymdhms + v_typeMsg + "!"); return rtn_1; } else { return rtn_2; } } catch (Exception e) { return rtn_3; } } /** * Calendar 轉(zhuǎn)換為 Date * * @return date日期 */ public static Date calToDate() { // (1) Calendar轉(zhuǎn)化為Date Calendar cal = Calendar.getInstance(); return calToDate(cal); } /** * Calendar 轉(zhuǎn)換為 Date * * @param cal * Calendar日期 * @return date日期 */ public static Date calToDate(Calendar cal) { // (1) Calendar轉(zhuǎn)化為Date Date date = cal.getTime(); return date; } /** * Date 轉(zhuǎn)換為 Calendar * * @return Calendar日期 */ public static Calendar dateToCal() { // (2) Date轉(zhuǎn)化為Calendar Date date = new Date(); return dateToCal(date); } /** * Date 轉(zhuǎn)換為 Calendar * * @param date * date日期 * @return Calendar日期 */ public static Calendar dateToCal(Date date) { // (2) Date轉(zhuǎn)化為Calendar Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal; } /** * 相差x年又y天 * * @param sd * 開(kāi)始日期 * @param ed * 結(jié)束日期 * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 * @return * */ public static String diffYearAndDay(Date startDate, Date endDate) { if (startDate == null || endDate == null) { return "?天"; } long diffDate = DateUtil.diffDay(startDate, endDate); int year = 0; while (diffDate > 365) { diffDate -= 365; year++; } if (year > 0) { return year + "年又" + diffDate + "天"; } else { return diffDate + "天"; } } /** * 相差日-秒 * * @param sd * 開(kāi)始日期 * @param ed * 結(jié)束日期 * @return 返回值為:{天, 時(shí), 分, 秒} */ public static long[] diffDayToSecond(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); long day = 0; long hour = 0; long min = 0; long sec = 0; day = diff / (24 * 60 * 60 * 1000); hour = (diff / (60 * 60 * 1000) - day * 24); min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60); sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60); long[] times = { day, hour, min, sec }; return times; } /** * 相差日 * * @param sd * 開(kāi)始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffDay(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (24 * 60 * 60 * 1000); } /** * 加日 * * @param d * 日期 * @param day * 天數(shù) * @return 計(jì)算后的日期 */ public static Date addDay(Date d, int day) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) day * 86400000L); return newD; } /** * 加月 * * @param d * 日期 * @param month * 月數(shù) * @return 計(jì)算后的日期 */ public static Date addMonth(Date d, int month) { Date newD = new Date(d.getTime()); GregorianCalendar gval = new GregorianCalendar(); gval.setTime(newD); gval.add(2, month); newD.setTime(gval.getTime().getTime()); return newD; } /** * 加年 * * @param d * 日期 * @param year * 年數(shù) * @return 計(jì)算后的日期 */ public static Date addYear(Date d, int year) { Date newD = new Date(d.getTime()); GregorianCalendar gval = new GregorianCalendar(); gval.setTime(newD); gval.add(1, year); newD.setTime(gval.getTime().getTime()); return newD; } /** * 相差時(shí) * * @param sd * 開(kāi)始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffHour(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (60 * 60 * 1000); } /** * 加小時(shí) * * @param d * 日期 * @param hour * 小時(shí)數(shù) * @return 計(jì)算后的日期 */ public static Date addHour(Date d, int hour) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) hour * 3600000L); return newD; } /** * 相差分 * * @param sd * 開(kāi)始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffMinute(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (60 * 1000); } /** * 加分 * * @param d * 日期 * @param minute * 分?jǐn)?shù) * @return 計(jì)算后的日期 */ public static Date addMinute(Date d, int minute) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) minute * 60000L); return newD; } /** * 相差秒 * * @param sd * 開(kāi)始日期 * @param ed * 結(jié)束日期 * @return 相差值 */ public static long diffSecond(Date sd, Date ed) { Date newSd = new Date(sd.getTime()); Date newEd = new Date(ed.getTime()); long diff = newEd.getTime() - newSd.getTime(); return diff / (1000); } /** * 加秒 * * @param d * 日期 * @param second * 秒數(shù) * @return 計(jì)算后的日期 */ public static Date addSecond(Date d, int second) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + (long) second * 1000L); return newD; } /** * 加毫秒 * * @param d * 日期 * @param minSecond * 毫秒數(shù) * @return 計(jì)算后的日期 */ public static Date addMinSecond(Date d, long minSecond) { Date newD = new Date(d.getTime()); newD.setTime(newD.getTime() + minSecond * 1L); return newD; } /** * 將元數(shù)據(jù)前補(bǔ)零,補(bǔ)后的總長(zhǎng)度為指定的長(zhǎng)度,以字符串的形式返回 * * @param sourceData * 源數(shù)據(jù) * @param formatLength * 長(zhǎng)度 * @return 重組后的數(shù)據(jù) */ public static String frontCompWithZore(int sourceData, int formatLength) { /* * 0 指前面補(bǔ)充零 formatLength 字符總長(zhǎng)度為 formatLength d 代表為正數(shù)。 */ String newString = String.format("%0" + formatLength + "d", sourceData); return newString; } /** * 毫秒轉(zhuǎn)時(shí)分秒毫秒 * * @param millis * @author 張軍 * @date 2015-11-03 21:59:00 * @modifiyNote * @version 1.0 * @return */ public static Map<String, Integer> millisToHmsS(int millis) { Map<String, Integer> values = new HashMap<String, Integer>(); // 時(shí) int h = 0; // 分 int m = 0; // 秒 int s = 0; // 毫秒 int S = 0; if (millis <= 1000) { S = millis; } else { int second = millis / 1000; if (millis % 1000 != 0) { // 毫秒數(shù) S = millis % 1000; } if (second > 3600) { // 如果大于3600秒 int temp = second % 3600; h = second / 3600; if (temp != 0) { if (temp > 60) { m = temp / 60; if (temp % 60 != 0) { s = temp % 60; } } else { s = temp; } } } else { // 如果小于等于3600秒 m = second / 60; if (second % 60 != 0) { s = second % 60; } } } // System.out.println(h + "時(shí)" + m + "分" + s + "秒" + S + "毫秒"); values.put("h", h); values.put("m", m); values.put("s", s); values.put("S", S); return values; } }
日期測(cè)試類源碼如下:
package test.all; import java.util.Date; import org.junit.Test; import zj.date.util.DateUtil; public class TestDateUtil { @Test public void 基本工具類() { TestUtil.printStart("測(cè)試日期工具類"); System.out.println("日期轉(zhuǎn)字符串"); System.out.println(DateUtil.dateParse(new Date(), "yyyy年MM月dd日HH時(shí)mm分ss秒SSS毫秒p(0-6=>周日-周六)w x q季度")); System.out.println("字符串轉(zhuǎn)日期"); System.out.println(DateUtil.parseDate("2019-07-30")); System.out.println(DateUtil.parseDate("2019-07-30 10:11:12")); System.out.println(DateUtil.parseDate("20190730")); System.out.println(DateUtil.parseDate("20190730101112")); System.out.println(DateUtil.parseDate("2019/07/30 10:11:12")); System.out.println(DateUtil.parseDate("2019-07-30 10:11")); System.out.println(DateUtil.parseDate("2019/07/30 10:11")); System.out.println(DateUtil.parseDate("2019/07/30 10")); System.out.println(DateUtil.parseDate("2019-07-30 10")); System.out.println("日期相差天數(shù)"); System.out.println("2019-02-25到2019-03-10共" + DateUtil.diffDay(DateUtil.parseDate("2019-02-25"), DateUtil.parseDate("2019-03-10")) + "天"); System.out.println("2019-02-25加10天是" + DateUtil.dateParse(DateUtil.addDay(DateUtil.parseDate("2019-02-25"), 10), "yyyy-MM-dd")); System.out.println("對(duì)日期或時(shí)間相加減就不多做測(cè)試了"); TestUtil.printEnd("測(cè)試日期工具類"); } @Test public void 日期范圍() { TestUtil.printStart("查詢?nèi)掌诜秶?quot;); String sstartDate = "2019-02-26"; String sendDate = "2019-03-06"; long diffDays = DateUtil.diffDay(DateUtil.parseDate(sstartDate), DateUtil.parseDate(sendDate)); System.out.println(sstartDate + "到" + sendDate + "共" + diffDays + "天,以下是循環(huán)每一天"); for (int a = 0; a <= diffDays; a++) { String tdate = DateUtil.dateParse(DateUtil.addDay(DateUtil.parseDate(sstartDate), a)); System.out.println(tdate); } TestUtil.printEnd("查詢?nèi)掌诜秶?quot;); } }
測(cè)試結(jié)果如下:
測(cè)試日期工具類------>測(cè)試開(kāi)始 日期轉(zhuǎn)字符串 2019年08月02日22時(shí)44分57秒216毫秒下午(0-6=>周日-周六)5 星期五 3季度 字符串轉(zhuǎn)日期 Tue Jul 30 00:00:00 CST 2019 Tue Jul 30 10:11:12 CST 2019 Tue Jul 30 00:00:00 CST 2019 Tue Jul 30 10:11:12 CST 2019 Tue Jul 30 10:11:12 CST 2019 Tue Jul 30 10:11:00 CST 2019 Tue Jul 30 10:11:00 CST 2019 Tue Jul 30 10:00:00 CST 2019 Tue Jul 30 10:00:00 CST 2019 日期相差天數(shù) 2019-02-25到2019-03-10共13天 2019-02-25加10天是2019-03-07 對(duì)日期或時(shí)間相加減就不多做測(cè)試了 測(cè)試日期工具類------>測(cè)試結(jié)束 查詢?nèi)掌诜秶?----->測(cè)試開(kāi)始 2019-02-26到2019-03-06共8天,以下是循環(huán)每一天 2019年02月26日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)2 星期二 1季度 2019年02月27日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)3 星期三 1季度 2019年02月28日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)4 星期四 1季度 2019年03月01日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)5 星期五 1季度 2019年03月02日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)6 星期六 1季度 2019年03月03日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)7 星期日 1季度 2019年03月04日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)1 星期一 1季度 2019年03月05日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)2 星期二 1季度 2019年03月06日00時(shí)00分00秒000毫秒上午(0-6=>周日-周六)3 星期三 1季度 查詢?nèi)掌诜秶?----->測(cè)試結(jié)束
本文為張軍原創(chuàng)文章,轉(zhuǎn)載無(wú)需和我聯(lián)系,但請(qǐng)注明來(lái)自張軍的軍軍小站,個(gè)人博客http://www.dlhighland.cn
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
