package cn.my.utils; import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; /** 时间工具类<p> * * @version 1.0<br> */ public class DateUtil { /** * 获得两个时间字符的时间差 * @param startTime * @param endTime * @return * @throws ParseException * Integer */ public static Integer distanceBySE(String startTime,String endTime){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //通过字符串创建两个日期对象 Date firstDate = null; Date secondDate = null; try { firstDate = sdf.parse(endTime); secondDate = sdf.parse(startTime); } catch (ParseException e) { e.printStackTrace(); } //得到两个日期对象的总毫秒数 long firstDateMilliSeconds = firstDate.getTime(); long secondDateMilliSeconds = secondDate.getTime(); //得到两者之差 long firstMinusSecond = firstDateMilliSeconds - secondDateMilliSeconds; //毫秒转为秒 long milliSeconds = firstMinusSecond; int totalSeconds = (int)(milliSeconds / 1000); //得到总天数 Integer days = totalSeconds / (3600*24); return days; } /** * 把格式为 年-月-日的时间转成年月日<p> * @param data * @return <p> * String */ public static String dataStr(String data){ String[] str = data.split("-"); String str1= ""; for(int i =0 ;i<str.length; i++){ str1= str1+str[i]; } if(str1.length() >0){ return str1.trim(); } return null; } /** * 把格式为yyyy-MM-dd的转化成yyyyMMdd<p> * @param date * @return <p> * String */ public static String dateByNum(String date){ SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); return format.format(strToDate(date,"yyyy-MM-dd")); } /** * 把格式为yyyy-MM-dd的转化成yyyyMMdd<p> * @param date * @return <p> * String */ public static String dateMonthByNum(String date){ SimpleDateFormat format = new SimpleDateFormat("yyyyMM"); return format.format(strToDate(date,"yyyy-MM")); } /** * 把格式为yyyy-MM的时间获取开始时间和结算时间<p> * @param monthDate * @return 20140401_20140430<p> * String */ public static String monthByStartAndEndTime(String monthDate){ String[] str =monthDate.split("-"); //日历 Calendar c = Calendar.getInstance(); //设置这个月的第一天 c.set(Integer.parseInt(str[0]), Integer.parseInt(str[1])-1, 1); //获取这个月一共有多少天 int lastDay=c.getActualMaximum(Calendar.DAY_OF_MONTH); String date =str[0]+str[1]+"01"+"_"+str[0]+str[1]+lastDay+""; return date; } public static String getWeekDate(String date){ String[] str = date.split("-"); return weekGetDate(str[0],str[1],Integer.parseInt(str[2])); } /** * 获得这周的开始时间 * @param year * @param month * @param week * @return * Date */ public static Date getProParamDate(String year , String month , int week){ String time = weekGetDate(year, month, week); String[] times = time.split("_"); SimpleDateFormat formatDate = new SimpleDateFormat("yyyyMMdd"); Date datatime = null; try { datatime = formatDate.parse(times[0]); } catch (ParseException e) { e.printStackTrace(); } return datatime; } /** * 根据年月周获取开始时间和结束时间<p> * @param year 年 * @param month 月 * @param week 周 * @return 开始时间和结算时间的字符串<p> * String */ public static String weekGetDate(String year,String month,int week){ // 存储周数所对应的天数 Map<Integer, String> map =new HashMap<Integer, String>(); //日历 Calendar c = Calendar.getInstance(); //设置这个月的第一天 c.set(Integer.parseInt(year), Integer.parseInt(month)-1, 1); //获取这个月的第一天 int firstWeek= c.get(Calendar.DAY_OF_WEEK)-1; //获取这个月一共有多少天 int lastDay=c.getActualMaximum(Calendar.DAY_OF_MONTH); double a; if(firstWeek ==0){ a =7; }else{ a=firstWeek; } //计算这个月一共有多少周 int weekNum = (int) Math.ceil((lastDay-(7-a+1))/7)+1; double startDay = 1; //循环获取这月的日期 for(int i=1;i<=weekNum;i++){ if(i==1){ map.put(i, year+"-"+month+"-"+(int)startDay+"_"+year+"-"+month+"-"+(int)((7-a)+1)); startDay = (7-a)+1; }else{ map.put(i, year+"-"+month+"-"+(int)(startDay+1)+"_"+year+"-"+month+"-"+(int)(startDay+7)); startDay= startDay+7; if(startDay>lastDay){ startDay= startDay-7; map.put(i, year+"-"+month+"-"+(int)(startDay+1)+"_"+year+"-"+month+"-"+(int)lastDay); break; } } } //根据周数获取开始时间和结算时间 return map.get(week); } /** * 将指定格式的字符串转换为日期类型,如果格式与字符串不匹配,则返回null。 * @param dateStr 待转换的字符串 * @param format 日期格式 * @return 转换后的日期对象 */ public static Date strToDate(String dateStr, String format) { //构造制定格式format的SimpleDateFormat对象。 SimpleDateFormat formatter = new SimpleDateFormat(format); //进行转换,这里要传入new ParsePosition(0),否则是抛出异常,而不是返回null return formatter.parse(dateStr, new ParsePosition(0)); } public static String strToString(String str){ String strs =null; if(str.length()==4){ strs ="00"+str; }else if(str.length()==5){ strs ="0"+str; }else if(str.length()==3){ strs ="000"+str; }else if(str.length()==2){ strs ="0000"+str; }else if(str.length()==1){ strs ="00000"+str; }else if(str.length()==0){ strs ="000000"; } else{ strs =str; } return strs; } public static Date getSpecifiedDay(Date date){ Calendar c = Calendar.getInstance(); c.setTime(date); int day=c.get(Calendar.DATE); c.set(Calendar.DATE,day-1); Date endDate = c.getTime(); return endDate; } public static Date strDate(String str,String format){ Date date =null; if(str.length()==4){ date = DateUtil.strToDate("00"+str,format); }else if(str.length()==5){ date = DateUtil.strToDate("0"+str,format); } else{ date = DateUtil.strToDate(str,format); } return date; } /** * 一个日期加几天后的日期<p> * @param time 要加以前的日期 * @param addDayNum 要加的天数 * @return 已经加过的日期<p> * Date */ public static Date getDateAddDay(String time,int addDayNum){ try { Date date= (new SimpleDateFormat("yyyyMMdd")).parse(time); Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.DATE, addDayNum); return cal.getTime(); } catch (ParseException e) { return null; } } /** * 根据省份证号码获取出生日期 * @param iDCard 身份证号码 * @return 出生日期 */ public static Date getBirthDayByiDCard(String iDCard){ String strDate = null; if(iDCard.length()==18){ strDate =iDCard.substring(6,14); }else{ strDate = iDCard.substring(6,12); strDate = "19"+strDate; } return strDate!= null? strToDate(strDate,"yyyyMMdd"):null; } }