package com.ycsoft.commons.helper; import java.text.DateFormat; import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 包含一系列对日期处理的函数 * * @author hh * @date Dec 3, 2009 1:16:21 PM */ public class DateHelper { public final static String FORMAT_YM="yyyyMM"; public final static String FORMAT_YMD_STR="yyyyMMdd"; public final static String FORMAT_YMD="yyyy-MM-dd"; public final static String FORMAT_TIME="yyyy-MM-dd HH:mm:ss"; public final static String FORMAT_TIME_START="yyyy-MM-dd 00:00:00"; public final static String FORMAT_TIME_END="yyyy-MM-dd 23:59:59"; public final static String FORMAT_TIME_VOD="yyyyMMdd000000"; public final static String FORMAT_TIME_VOD_END="yyyyMMdd235959"; private final static NewDateFormat df = new NewDateFormat(FORMAT_TIME); private final static NewDateFormat sdf = new NewDateFormat(FORMAT_YMD); private final static NewDateFormat ym = new NewDateFormat(FORMAT_YM); private final static NewDateFormat ymvod = new NewDateFormat(FORMAT_TIME_VOD); private final static NewDateFormat ymd = new NewDateFormat(FORMAT_YMD_STR); public static final String SECOND = "second"; public static final String MINUTE = "minute"; public static final String HOUR = "hour"; public static final String DAY = "day"; /** * 将指定日期按指定的format格式化。 * @return */ public static String format(Date date,String format) { if(null == date) { return ""; }else{ return new SimpleDateFormat( format ).format(date); } } /** * 获取指定日期,输出格式化为yyyy-MM-dd HH:mm:ss * @return */ public static String format(Date date) { if(date == null) return ""; return df.format(date); } /** * 获取当前时刻日期,格式为yyyy-MM-dd HH:mm:ss * @return */ public static String formatNowTime() { Date date = new Date(); return df.format(date); } /** * 获取当前时刻日期,格式为yyyy-MM-dd * @return */ public static String formatNow() { Date date = new Date(); return sdf.format(date); } public static String nowYearMonth() { Date date = new Date(); return ym.format(date); } /** * 获取当前时刻日期 * @return */ public static Date now() { return new Date(); } /** * 获取当前日期0点的日期时间 * @return */ public static Date today() { Calendar calendar = Calendar.getInstance(); 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(); } /** * 日期去时分秒 * @param date * @return */ public static Date getTruncDate(Date date){ Calendar calendar = Calendar.getInstance(); calendar.setTime(date); 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(); } public static int getCurrYear(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); return c.get(Calendar.YEAR); } /** * 获取当前日期年份 * * @return */ public static int getCurrYear() { Calendar c = Calendar.getInstance(); c.setTime(new Date()); return c.get(Calendar.YEAR); } /** * 获取当前日期月份 * @return */ public static int getCurrMonth() { Calendar c = Calendar.getInstance(); c.setTime(new Date()); return c.get(Calendar.MONTH); } /** * 获取当前日期天 * @return */ public static int getCurrDAY() { Calendar c = Calendar.getInstance(); c.setTime(new Date()); return c.get(Calendar.DATE); } /** * 获取当前小时 * @return */ public static int getCurrHour() { Calendar c = Calendar.getInstance(); c.setTime(new Date()); return c.get(Calendar.HOUR_OF_DAY); } public static int getCurrMinute() { Calendar c = Calendar.getInstance(); c.setTime(new Date()); return c.get(Calendar.MINUTE); } /** * 将时间字符串格式化yyyy-MM-dd HH:mm:ss * @return */ public static String format(String datestr) { Date date; try { date = df.parse(datestr); } catch (ParseException e) { date = new Date(); } return df.format(date); } /** * 将短时间格式时间转换为字符串 yyyy-MM-dd * @param dateDate * @return */ public static String dateToStr(java.util.Date dateDate) { if (dateDate == null) return ""; return new SimpleDateFormat(FORMAT_YMD).format(dateDate); } public static String dateToStrYmvod(java.util.Date dateDate) { if (dateDate == null) return ""; return ymvod.format(dateDate); } public static String dateToStrYMD(java.util.Date dateDate) { if (dateDate == null) return ""; String dateString = ymd.format(dateDate); return dateString; } /** * 将短时间格式时间转换为字符串 yyyyMM * @param dateDate * @return */ public static String formatYM(Date dateDate){ if (dateDate == null) return ""; return ym.format(dateDate); } public static Date strToDateYM(String strDate) { ParsePosition pos = new ParsePosition(0); Date strtodate = ym.parse(strDate, pos); return strtodate; } public static String formatAddMonthYM(Date dateDate){ if (dateDate == null) return ""; Calendar cal = Calendar.getInstance(); cal.setTime(dateDate); cal.add(Calendar.MONTH, 1); return ym.format(cal.getTime()); } /** * 将短时间格式字符串转换为时间 yyyy-MM-dd * @param strDate * @return */ public static Date strToDate(String strDate) { ParsePosition pos = new ParsePosition(0); return new SimpleDateFormat(FORMAT_YMD).parse(strDate, pos); } public static Date strYMDToDate(String strDate){ ParsePosition pos = new ParsePosition(0); Date strtodate = ymd.parse(strDate, pos); return strtodate; } /** * 将短时间格式字符串转换为时间 yyyyMMddHHmmss * @param strDate * @return */ public static Date vodStrToDate(String strDate){ ParsePosition pos = new ParsePosition(0); Date strtodate = ymvod.parse(strDate, pos); return strtodate; } /** * 当前日期按分隔符号"spt"分隔返回显示,不含时分秒 * @return */ public static String getDate(String spt) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy" + spt + "MM" + spt+ "dd"); java.util.Date date = new java.util.Date(); return sdf.format(date); } /** * 获取给定时间加N天后的日期, * 如果N为负数那么就是给定时间减天 * @return date */ public static java.util.Date addDate(java.util.Date date, int day) { java.util.Calendar c = java.util.Calendar.getInstance(); c.setTime(date); c.add(Calendar.DATE, day); return c.getTime(); } public static java.util.Date addTypeDate(java.util.Date date, String type, int num){ java.util.Calendar c = java.util.Calendar.getInstance(); c.setTime(date); if(type.equals("DATE")){ c.add(Calendar.DATE, num); }else if(type.equals("MONTH")){ c.add(Calendar.MONTH, num); }else if(type.equals("DAY")){ c.add(Calendar.DAY_OF_MONTH, num); } return c.getTime(); } /** * 获取两个日期之间的间隔天数(1) * @return */ public static int getDiffDays(Date beginDate, Date endDate){ //舍去时分秒 try { beginDate = DateHelper.parseDate(DateHelper.dateToStr(beginDate), DateHelper.FORMAT_YMD); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } long lBeginTime = beginDate.getTime(); long lEndTime = endDate.getTime(); int iDay = (int) ((lEndTime - lBeginTime) / 86400000); return iDay; } /** * 获取两个日期之间的间隔天数(2) * @return */ public static int getDifferDays(String beginDate,String endDate) { Date date1 = null, date2 = null; int days=0; try { date1 = sdf.parse(beginDate); date2 = sdf.parse(endDate); days=(int) ((date2.getTime()-date1.getTime())/86400000); } catch (ParseException e) { e.printStackTrace(); } return days; } public static int getDiffMonth(Date begin, Date end){ Calendar bc = Calendar.getInstance(); bc.setTimeInMillis(begin.getTime()); //bc.setTime(begin.getTime()); Calendar be = Calendar.getInstance(); be.setTime(end); int beginYear = bc.get(Calendar.YEAR); int beginMonth = bc.get(Calendar.MONTH); int endYear = be.get(Calendar.YEAR); int endMonth = be.get(Calendar.MONTH); int difMonth = (endYear-beginYear)*12+(endMonth-beginMonth); return difMonth; } /** * 获取本月第一天(根据当前时间) * @return */ public static String getFirstDateInCurrentMonth() { return getFirstDateInCurrentMonth(new Date()); } public static String getFirstDateInCurrentMonth(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); String year = String.valueOf(calendar.get(Calendar.YEAR)); String month = String.valueOf(calendar.get(Calendar.MONTH)+1); String day = "01"; return year +"-"+ (month.length() == 1 ? "0" + month : month)+"-" + day; } /** * 获取本月最后一天(根据当前时间) */ public static String getLastDateInCurrentMonth(Date date){ String str = ""; Calendar lastDate = Calendar.getInstance(); lastDate.setTime(date); lastDate.set(Calendar.DATE,1);//设为当前月的1号 lastDate.add(Calendar.MONTH,1);//加一个月,变为下月的1号 lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天 str=sdf.format(lastDate.getTime()); return str; } /** * 获取本年度第一天(根据当前时间) * @return */ public static String getFirstDateInCurrentYear() { Calendar calendar = Calendar.getInstance(); String year = String.valueOf(calendar.get(Calendar.YEAR)); String month = "01"; String day = "01"; return year +"-"+ month+"-" + day+" 00:00:00"; } /** * 获取下个月的第一天,根据输入时间 * @return */ public static Date getNextMonth(Date date){ Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.DAY_OF_MONTH,1);//set the first day. c.add(Calendar.MONDAY,1); //set next month return c.getTime(); } public static Date getNextMonthByNum(Date date,int num){ Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH,num); //set next month return c.getTime(); } /** * 指定日期增加指定月数并减一天 * @param date * @param month_num * @return */ public static Date getNextMonthPreviousDay(Date date,int month_num){ Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.MONTH,month_num); //set next month c.add(Calendar.DAY_OF_MONTH, -1); return c.getTime(); } /** * 获取明天日期 格式yyyy-MM-dd * @return */ public static String getNextDay(){ Calendar c = Calendar.getInstance(); c.add(Calendar.DAY_OF_MONTH,1); return sdf.format(c.getTime()); } /** * 日期加上num秒 如DateHelper.addNumDate(date, 100, "second"); * @param date * @param num * @param type * @return */ public static Date addNumDate(Date date, int num, String type){ long result = 0; if(type == null || type.equals(SECOND)) { result = date.getTime() + num*1000; } else if(type.equals(MINUTE)) { result = date.getTime() + num*60*1000; } else if(type.equals(HOUR)) { result = date.getTime() + num*60*60*1000; } else if(type.equals(DAY)) { result = date.getTime() + num*24*60*60*1000; } ParsePosition pos = new ParsePosition(0); Date strtodate = df.parse(df.format(new Date(result)), pos); return strtodate; } /** * 获得一个月共有多少天 * @param date * @return */ public static String getDateSumDay(String date){ String day=""; String month = date.substring(5, 7); if(month.equals("02")){ if(isLeapYear(date)){ day="29"; }else{ day="28"; } }else if(month.equals("01")||month.equals("03")||month.equals("05")||month.equals("07")||month.equals("08")||month.equals("10")||month.equals("12")){ day="31"; }else{ day="30"; } String dateInfo1 = date.substring(0,8)+""+ day ; return dateInfo1; } /** * 指定日期(默认当天)的第一个时刻 * @param date * @return */ public final static String firstTimestampMonth(Date date) { String firstDate = sdf.format(new Date()) + " 00:00:00"; if (date != null) firstDate = sdf.format(date) + " 00:00:00"; return firstDate; } /** * 指定日期(默认当天)的最后时刻 * @param date * @return */ public final static String lastTimestampDate(Date date) { String lastTime = sdf.format(new Date()) + " 23:59:59"; if (date != null) lastTime = sdf.format(date) + " 23:59:59"; return lastTime; } /** * 比较两个字符型日期是否一致 yyyy-MM-dd * @param d1 * @param d2 * @return */ public static int compareDate(String d1,String d2){ if (d1.trim().length()>10){ d1 = d1.split(" ")[0]; } if (d2.trim().length()>10){ d2 = d2.split(" ")[0]; } GregorianCalendar date1 = new GregorianCalendar(); String[] temp1 = d1.split("-"); date1.set(Calendar.YEAR, Integer.parseInt(temp1[0])); date1.set(Calendar.MONTH, Integer.parseInt(temp1[1].substring(0,1).equals("0")?temp1[1].substring(1):temp1[1])-1); date1.set(Calendar.DATE, Integer.parseInt(temp1[2].substring(0,1).equals("0")?temp1[2].substring(1):temp1[2])); GregorianCalendar date2 = new GregorianCalendar(); String[] temp2 = d2.split("-"); date2.set(Calendar.YEAR, Integer.parseInt(temp2[0])); date2.set(Calendar.MONTH, Integer.parseInt(temp2[1].substring(0,1).equals("0")?temp2[1].substring(1):temp2[1])-1); date2.set(Calendar.DATE, Integer.parseInt(temp2[2].substring(0,1).equals("0")?temp2[2].substring(1):temp2[2])); int result = date1.compareTo(date2); return result; } /** * 在日期中取出指定部分的字符串值(年、月、日、时、分、秒) * date 格式yyyy-MM-dd HH:mm:ss * @param date * @param part 1年 2月 5日 10时 12分 13秒 Calendar.MONTH * @return */ public static String GetDatePart(String date, int part) { try { SimpleDateFormat df=new SimpleDateFormat(FORMAT_TIME); Date time =df.parse(date); df.format(time); if (Calendar.MONTH == part) return String.valueOf(df.getCalendar().get(part) + 1); else return String.valueOf(df.getCalendar().get(part)); } catch (Exception ex) { ex.printStackTrace(); return ""; } } /** * 判断date1是否在date2之前 * @param date1 df格式 * @param date2 * @return */ public static boolean isDateBefore(String date1,String date2){ try{ return df.parse(date1).before(df.parse(date2)); }catch(ParseException e){ return false; } } /** * 判断当前时间是否在时间date2之前 * @param date2 df格式 * @return */ public static boolean isDateBefore(String date2){ try{ Date date1 = new Date(); return date1.before(df.parse(date2)); }catch(ParseException e){ return false; } } public static boolean isDateBefore(Date date){ Date date1 = new Date(); return date1.before(date); } /** * 给出两个日期,计算他们之间相差的年数|月数|天数 * @param c1 日期1 * @param c2 日期2 * @param what 比较模式,如果是Calendar.YEAR则在年份上比较; * 如果是Calendar.MONTH则在月数上比较; * 如果是Calendar.DATE则在天数上比较(默认情形) * @return 相差的年数或月数或天数 */ public static int compare(Calendar c1,Calendar c2,int what) { int number=0; switch (what) { case Calendar.YEAR: number=c1.get(Calendar.YEAR)-c2.get(Calendar.YEAR); break; case Calendar.MONTH: int years=compare(c1,c2,Calendar.YEAR); number=12*years+c1.get(Calendar.MONTH)-c2.get(Calendar.MONTH); break; case Calendar.DATE: number=(int) ((c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60*60*24)); break; default: number=(int) ((c1.getTimeInMillis()-c2.getTimeInMillis())/(1000*60*60*24)); break; } return number; } /** * 2个日期相差多少月 * @param startDate * @param endDate * @return */ public static int compareToMonthByDate(Date startDate,Date endDate) { Calendar startCal = new GregorianCalendar(); Calendar endCal = new GregorianCalendar(); startCal.setTime(startDate); endCal.setTime(endDate); int a = compare(endCal,startCal,2); return a; } /** * @param startDate * @param endDate * @return */ public static int compareToMonthByString(String startDate,String endDate) { int number=0; try { Date d1 = sdf.parse(startDate); Date d2=sdf.parse(endDate); Calendar startCal = new GregorianCalendar(); Calendar endCal = new GregorianCalendar(); startCal.setTime(d1); endCal.setTime(d2); number = compare(endCal,startCal,2); } catch (ParseException e) { e.printStackTrace(); } return number; } /** * 判断是否润年 * @param ddate * @return */ public static boolean isLeapYear(String ddate) { /** * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年 * 3.能被4整除同时能被100整除则不是闰年 */ Date d =strToDate(ddate); GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance(); gc.setTime(d); int year = gc.get(Calendar.YEAR); if (year % 400 == 0) return true; else if (year % 4 == 0) { if (year % 100 == 0) return false; else return true; } else return false; } /** * 判断日期是否为当天 * @param date * @return */ public static boolean isToday(Date date){ return dateToStr(date).equals(dateToStr(now())); } /** * 按照指定格式将给出的字符串转化成Date对象 * @param strDate * @param format * @return */ public static Date parseDate(String strDate,String format) throws Exception { ParsePosition pos = new ParsePosition(0); DateFormat df = new SimpleDateFormat(format); Date strtodate = df.parse(strDate, pos); return strtodate; } public static Date getNexYearByNum(Date date,int num){ Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.YEAR,num); //set next month return c.getTime(); } public static void main(String[] args){ System.out.println(DateHelper.FORMAT_TIME+DateHelper.format(new Date(), DateHelper.FORMAT_TIME)); System.out.println(DateHelper.FORMAT_TIME_START+DateHelper.format(new Date(), DateHelper.FORMAT_TIME_START)); System.out.println(DateHelper.FORMAT_TIME_END+DateHelper.format(new Date(), DateHelper.FORMAT_TIME_END)); System.out.println(DateHelper.FORMAT_TIME_VOD+DateHelper.format(new Date(), DateHelper.FORMAT_TIME_VOD)); System.out.println(DateHelper.FORMAT_TIME_VOD_END+DateHelper.format(new Date(), DateHelper.FORMAT_TIME_VOD_END)); // System.out.println(DateHelper.dateToStr(DateHelper.addDate(new Date(), 2))); // // System.out.println(DateHelper.getDiffDays(new Date(),DateHelper.addDate(new Date(), 3))); // // // System.out.println(DateHelper.format(new Date(), DateHelper.FORMAT_TIME_VOD)); List<Map.Entry<String,String>> mappingList = null; Map<String,String> map = new HashMap<String,String>(); map.put("aaaa", "month"); map.put("bbbb", "bread"); map.put("ccccc", "attack"); //通过ArrayList构造函数把map.entrySet()转换成list mappingList = new ArrayList<Map.Entry<String,String>>(map.entrySet()); //通过比较器实现比较排序 Collections.sort(mappingList, new Comparator<Map.Entry<String,String>>(){ public int compare(Map.Entry<String,String> mapping1,Map.Entry<String,String> mapping2){ return mapping1.getValue().compareTo(mapping2.getValue()); } }); for(Map.Entry<String,String> mapping:mappingList){ System.out.println(mapping.getKey()+":"+mapping.getValue()); } } } /** * 新的时间类型格式工具 * 解决parse方法在并发下的错误 * @author new * */ class NewDateFormat{ private String format_str=null; private DateFormat format =null; public NewDateFormat(String format_str){ this.format_str=format_str; this.format=new SimpleDateFormat(format_str); } public String format(Date date){ return this.format.format(date); } public Date parse(String date) throws ParseException{ return new SimpleDateFormat(format_str).parse(date); } public Date parse(String date,ParsePosition pos){ return new SimpleDateFormat(format_str).parse(date,pos); } }