package com.yihu.jw.util; import org.apache.commons.lang3.StringUtils; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.*; public class DateUtil { public static final String HH_MM = "HH:mm"; public static final String HH_MM_SS = "HH:mm:ss"; public static final String YY = "yy"; public static final String YYYYMM = "yyyyMM"; public static final String YYYYMMDD = "yyyyMMdd"; public static final String YYYY_MM_DD = "yyyy-MM-dd"; public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; public static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH"; public static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm"; public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; public static final String YYYY_M_D_HH_MM_SS = "yyyy/M/d HH:mm:ss"; /** * 时间格式转中文格式 */ public static String dateToChinese(Date date) { SimpleDateFormat formatter = new SimpleDateFormat( "yyyy年MM月dd日 EEEEaaaa hh:mm", Locale.CHINA); return formatter.format(date); } /*public static void main(String[] args) { System.out.print(dateToChinese(new Date())); }*/ /** * 字符串转时间格式 */ public static Date strToDate(String strDate) { if (StringUtils.isEmpty(strDate)) { return null; } else{ int length = strDate.length(); if(strDate.contains("/")) { strDate = strDate.replace("/","-"); } if(strDate.contains("-")) { if(length == 10) { return strToDate(strDate,YYYY_MM_DD); } else if(length == 19) { return strToDate(strDate,YYYY_MM_DD_HH_MM_SS); } } else{ if(length == 8) { return strToDate(strDate,YYYYMMDD); } else if(length == 14) { return strToDate(strDate,YYYYMMDDHHMMSS); } } } return null; } /** * 获取现在时间 * * @return 返回时间类型 yyyy-MM-dd HH:mm:ss */ public static Date getNowDate() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); String dateString = formatter.format(currentTime); ParsePosition pos = new ParsePosition(0); return formatter.parse(dateString, pos); } /** * 获取现在时间 * * @return返回短时间格式 yyyy-MM-dd */ public static Date getNowDateShort() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD); String dateString = formatter.format(currentTime); return strToDate(dateString, YYYY_MM_DD); } /** * 获取现在时间 * * @return返回字符串格式 yyyy-MM-dd HH:mm:ss */ public static String getStringDate() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); return formatter.format(currentTime); } /** * 获取现在时间 * * @return返回字符串格式 yyyy-MM-dd HH:mm:ss */ public static String getStringDate(String format) { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(format); return formatter.format(currentTime); } /** * 获取现在时间 * * @return 返回短时间字符串格式yyyy-MM-dd */ public static String getStringDateShort() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD); return formatter.format(currentTime); } /** * 获取时间 小时:分;秒 HH:mm:ss * * @return */ public static String getTimeShort() { SimpleDateFormat formatter = new SimpleDateFormat(HH_MM_SS); Date currentTime = new Date(); return formatter.format(currentTime); } /** * 将长时间格式字符串转换为时间 yyyy-MM-dd HH:mm:ss * * @param strDate * @return */ public static Date strToDateLong(String strDate) { if (StringUtils.isEmpty(strDate)) { return null; } SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); ParsePosition pos = new ParsePosition(0); return formatter.parse(strDate, pos); } public static Date strToDateShort(String strDate) { if (StringUtils.isEmpty(strDate)) { return null; } SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD); ParsePosition pos = new ParsePosition(0); return formatter.parse(strDate, pos); } /** * 将长时间格式时间转换为字符串 yyyy-MM-dd HH:mm:ss * * @param dateDate * @return */ public static String dateToStrLong(Date dateDate) { if (dateDate == null) { return ""; } SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); return formatter.format(dateDate); } public static String dateToStrNoSecond(Date dateDate) { if (dateDate == null) { return ""; } SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM); return formatter.format(dateDate); } /** * 将长时间格式时间转换为字符串 yyyy-MM-dd * * @param dateDate * @return */ public static String dateToStrShort(Date dateDate) { if (dateDate == null) { return ""; } SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD); return formatter.format(dateDate); } /** * 将短时间格式时间转换为字符串 yyyy-MM-dd */ public static String dateToStr(Date dateDate, String format) { if (dateDate == null) { return ""; } SimpleDateFormat formatter = new SimpleDateFormat(format); return formatter.format(dateDate); } /** * 将短时间格式字符串转换为时间 * * @param strDate * @return */ public static Date strToDate(String strDate, String format) { if (StringUtils.isEmpty(strDate)) { return null; } SimpleDateFormat formatter = new SimpleDateFormat(format); ParsePosition pos = new ParsePosition(0); return formatter.parse(strDate, pos); } public static Date strToDateAppendNowTime(String strDate, String format) { if (StringUtils.isEmpty(strDate)) { return null; } strDate += " " + getTimeShort(); SimpleDateFormat formatter = new SimpleDateFormat(format); ParsePosition pos = new ParsePosition(0); return formatter.parse(strDate, pos); } /** * 得到现在时间 * * @return */ public static Date getNow() { Date currentTime = new Date(); return currentTime; } /** * 提取一个月中的最后一天 * * @param day * @return */ public static Date getLastDate(long day) { Date date = new Date(); long date_3_hm = date.getTime() - 3600000 * 34 * day; Date date_3_hm_date = new Date(date_3_hm); return date_3_hm_date; } /** * 得到现在时间 * * @return 字符串 yyyyMMdd HHmmss */ public static String getStringToday() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd HHmmss"); String dateString = formatter.format(currentTime); return dateString; } /** * 得到现在小时 */ public static String getHour() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); String dateString = formatter.format(currentTime); String hour; hour = dateString.substring(11, 13); return hour; } /** * 得到现在分钟 * * @return */ public static String getTime() { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); String dateString = formatter.format(currentTime); String min; min = dateString.substring(14, 16); return min; } /** * 根据用户传入的时间表示格式,返回当前时间的格式 如果是yyyyMMdd,注意字母y不能大写。 * * @param sformat * yyyyMMddhhmmss * @return */ public static String getUserDate(String sformat) { Date currentTime = new Date(); SimpleDateFormat formatter = new SimpleDateFormat(sformat); String dateString = formatter.format(currentTime); return dateString; } /** * 二个小时时间间的差值,必须保证二个时间都是"HH:MM"的格式,返回字符型的分钟 */ public static String getTwoHour(String st1, String st2) { String[] kk = null; String[] jj = null; kk = st1.split(":"); jj = st2.split(":"); if (Integer.parseInt(kk[0]) < Integer.parseInt(jj[0])) return "0"; else { double y = Double.parseDouble(kk[0]) + Double.parseDouble(kk[1]) / 60; double u = Double.parseDouble(jj[0]) + Double.parseDouble(jj[1]) / 60; if ((y - u) > 0) return y - u + ""; else return "0"; } } /** * 得到二个日期间的间隔天数 */ public static String getTwoDay(String sj1, String sj2) { SimpleDateFormat myFormatter = new SimpleDateFormat(YYYY_MM_DD); long day = 0; try { Date date = myFormatter.parse(sj1); Date mydate = myFormatter.parse(sj2); day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); } catch (Exception e) { return ""; } return day + ""; } /** * 时间前推或后推分钟,其中JJ表示分钟. */ public static String getPreTime(String sj1, String jj) { SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); String mydate1 = ""; try { Date date1 = format.parse(sj1); long Time = (date1.getTime() / 1000) + Integer.parseInt(jj) * 60; date1.setTime(Time * 1000); mydate1 = format.format(date1); } catch (Exception e) { } return mydate1; } /** * 时间前推或后推天数(负数前推正数后推) * date 基准时间 */ public static Date getPreDays(Date date, int days) { Date day = null; try { Calendar c = Calendar.getInstance(); c.setTime(date); c.add(Calendar.DATE, days); day = c.getTime(); } catch (Exception e) { } return day; } /** * 得到一个时间延后或前移几分钟的时间,nowdate为时间,delay为前移或后延的分钟数 */ public static Date getNextMin(Date date, int delay) { try { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MINUTE, delay); return cal.getTime(); } catch (Exception e) { return null; } } /** * 得到一个时间延后或前移几天的时间,nowdate为时间,delay为前移或后延的天数 */ public static String getNextDay(String nowdate, int delay) { try { SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD); String mdate = ""; Date d = strToDate(nowdate, YYYY_MM_DD); long myTime = (d.getTime() / 1000) + delay * 24 * 60 * 60; d.setTime(myTime * 1000); mdate = format.format(d); return mdate; } catch (Exception e) { return ""; } } // public static String getNextDay(Date d, int delay) { // try { // SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD); // String mdate = ""; // long myTime = (d.getTime() / 1000) + delay * 24 * 60 * 60; // d.setTime(myTime * 1000); // mdate = format.format(d); // return mdate; // } catch (Exception e) { // return ""; // } // } public static String getNextDay(Date d, int days) { Calendar c = Calendar.getInstance(); c.setTime(d); c.add(Calendar.DATE, days); return dateToStrShort(c.getTime()); } public static String getNextMonth(Date d, int months) { Calendar c = Calendar.getInstance(); c.setTime(d); c.add(Calendar.MONTH, months); return dateToStrShort(c.getTime()); } public static String getNextYear(Date d, int year) { Calendar c = Calendar.getInstance(); c.setTime(d); c.add(Calendar.YEAR, year); return dateToStrShort(c.getTime()); } /** * 获取本月第一天 * @return */ public static String getCurMonthFirstDayShort(){ Calendar c = Calendar.getInstance(); c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 return dateToStrShort(c.getTime()); } /** * 判断是否润年 * * @param ddate * @return */ public static boolean isLeapYear(String ddate) { /** * 详细设计: 1.被400整除是闰年,否则: 2.不能被4整除则不是闰年 3.能被4整除同时不能被100整除则是闰年 * 3.能被4整除同时能被100整除则不是闰年 */ Date d = strToDate(ddate, YYYY_MM_DD); 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; } /** * 返回美国时间格式 26 Apr 2006 * * @param str * @return */ public static String getEDate(String str) { SimpleDateFormat formatter = new SimpleDateFormat(YYYY_MM_DD); ParsePosition pos = new ParsePosition(0); Date strtodate = formatter.parse(str, pos); String j = strtodate.toString(); String[] k = j.split(" "); return k[2] + k[1].toUpperCase() + k[5].substring(2, 4); } /** * 获取一个月的最后一天 * * @param dat * @return */ public static String getEndDateOfMonth(String dat) {// yyyy-MM-dd String str = dat.substring(0, 8); String month = dat.substring(5, 7); int mon = Integer.parseInt(month); if (mon == 1 || mon == 3 || mon == 5 || mon == 7 || mon == 8 || mon == 10 || mon == 12) { str += "31"; } else if (mon == 4 || mon == 6 || mon == 9 || mon == 11) { str += "30"; } else { if (isLeapYear(dat)) { str += "29"; } else { str += "28"; } } return str; } /** * 判断二个时间是否在同一个周 * * @param date1 * @param date2 * @return */ public static boolean isSameWeekDates(Date date1, Date date2) { Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(date1); cal2.setTime(date2); int subYear = cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR); if (0 == subYear) { if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) return true; } else if (1 == subYear && 11 == cal2.get(Calendar.MONTH)) { // 如果12月的最后一周横跨来年第一周的话则最后一周即算做来年的第一周 if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) return true; } else if (-1 == subYear && 11 == cal1.get(Calendar.MONTH)) { if (cal1.get(Calendar.WEEK_OF_YEAR) == cal2.get(Calendar.WEEK_OF_YEAR)) return true; } return false; } /** * 产生周序列,即得到当前时间所在的年度是第几周 * * @return */ public static String getSeqWeek() { Calendar c = Calendar.getInstance(Locale.CHINA); String week = Integer.toString(c.get(Calendar.WEEK_OF_YEAR)); if (week.length() == 1) week = "0" + week; String year = Integer.toString(c.get(Calendar.YEAR)); return year + week; } /** * 获得一个日期所在的周的星期几的日期,如要找出2002年2月3日所在周的星期一是几号 * * @param sdate * @param num * @return */ public static String getWeek(String sdate, String num) { // 再转换为时间 Date dd = DateUtil.strToDate(sdate, YYYY_MM_DD); Calendar c = Calendar.getInstance(); c.setTime(dd); if (num.equals("1")) // 返回星期一所在的日期 c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); else if (num.equals("2")) // 返回星期二所在的日期 c.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY); else if (num.equals("3")) // 返回星期三所在的日期 c.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY); else if (num.equals("4")) // 返回星期四所在的日期 c.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY); else if (num.equals("5")) // 返回星期五所在的日期 c.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY); else if (num.equals("6")) // 返回星期六所在的日期 c.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY); else if (num.equals("0")) // 返回星期日所在的日期 c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); return new SimpleDateFormat("yyyy-MM-dd").format(c.getTime()); } /** * 获取2个时间点的工作日天数 * @param startDate 开始时间 * @param endDate 结束时间 * @return */ public static int getDutyDays(Date startDate, Date endDate) { int result = 0; Date startTime = new Date(startDate.getTime()); while (startTime.compareTo(endDate) <= 0) { if (startTime.getDay() != 6 && startTime.getDay() != 0) { result++; } startTime.setDate(startTime.getDate() + 1); } return result; } /** * 根据一个日期,返回是星期几的字符串 * * @param sdate * @return */ public static String getWeek(String sdate) { // 再转换为时间 Date date = DateUtil.strToDate(sdate, YYYY_MM_DD); Calendar c = Calendar.getInstance(); c.setTime(date); // int hour=c.get(Calendar.DAY_OF_WEEK); // hour中存的就是星期几了,其范围 1~7 // 1=星期日 7=星期六,其他类推 return new SimpleDateFormat("EEEE").format(c.getTime()); } public static String getWeekStr(String sdate) { String str = ""; str = DateUtil.getWeek(sdate); if ("1".equals(str)) { str = "星期日"; } else if ("2".equals(str)) { str = "星期一"; } else if ("3".equals(str)) { str = "星期二"; } else if ("4".equals(str)) { str = "星期三"; } else if ("5".equals(str)) { str = "星期四"; } else if ("6".equals(str)) { str = "星期五"; } else if ("7".equals(str)) { str = "星期六"; } return str; } /** * 两个时间之间的天数 * * @param date1 * @param date2 * @return */ public static long getDays(String date1, String date2) { if (date1 == null || date1.equals("")) return 0; if (date2 == null || date2.equals("")) return 0; // 转换为标准时间 SimpleDateFormat myFormatter = new SimpleDateFormat(YYYY_MM_DD); Date date = null; Date mydate = null; try { date = myFormatter.parse(date1); mydate = myFormatter.parse(date2); } catch (Exception e) { } long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); return day; } /** * 返回两个日期相差的天数 * @param date1 * @param date2 * @return */ public static long getDays(Date date1, Date date2) { if (date1 == null || date2 == null) return 0; long day = (date1.getTime() - date2.getTime()) / (24 * 60 * 60 * 1000); return day; } /** * 形成如下的日历 , 根据传入的一个时间返回一个结构 星期日 星期一 星期二 星期三 星期四 星期五 星期六 下面是当月的各个时间 * 此函数返回该日历第一行星期日所在的日期 * * @param sdate * @return */ public static String getNowMonth(String sdate) { // 取该时间所在月的一号 sdate = sdate.substring(0, 8) + "01"; // 得到这个月的1号是星期几 Date date = DateUtil.strToDate(sdate, YYYY_MM_DD); Calendar c = Calendar.getInstance(); c.setTime(date); int u = c.get(Calendar.DAY_OF_WEEK); String newday = DateUtil.getNextDay(sdate, 1 - u); return newday; } /** * 取得数据库主键 生成格式为yyyymmddhhmmss+k位随机数 * * @param k 表示是取几位随机数,可以自己定 */ public static String getNo(int k) { return getUserDate("yyyyMMddhhmmss") + getRandom(k); } /** * 返回一个随机数 * * @param i * @return */ public static String getRandom(int i) { Random jjj = new Random(); if (i == 0) return ""; String jj = ""; for (int k = 0; k < i; k++) { jj = jj + jjj.nextInt(9); } return jj; } /** * 根据用户生日计算年龄 */ public static int getAgeByBirthday(Date birthday) { try { int age = 0; if (birthday == null) { return age; } String birth = new SimpleDateFormat("yyyyMMdd").format(birthday); int year = Integer.valueOf(birth.substring(0, 4)); int month = Integer.valueOf(birth.substring(4, 6)); int day = Integer.valueOf(birth.substring(6)); Calendar cal = Calendar.getInstance(); age = cal.get(Calendar.YEAR) - year; //周岁计算 if (cal.get(Calendar.MONTH) < (month - 1) || (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.DATE) < day)) { age--; } return age; } catch (Exception e) { return 0; } } /** * 字符串转时间 * @param str 时间字符串 * @param eg 格式 * @return */ public static Date stringToDate(String str, String eg) { DateFormat format = new SimpleDateFormat(eg); Date date = null; if (str != null && !"".equals(str)) { try { date = format.parse(str); } catch (Exception e) { return null; } } return date; } public static int getNowMonth(){ Calendar cal = Calendar.getInstance(); return cal.get(Calendar.MONTH)+1; } public static int getNowYear(){ Calendar cal = Calendar.getInstance(); return cal.get(Calendar.YEAR); } /** * 获取周一 * @return */ public static String getMondayOfThisWeek() { SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1; if (day_of_week == 0) day_of_week = 7; c.add(Calendar.DATE, -day_of_week + 1); return df2.format(c.getTime()); } /** * 得到本周周日 * * @return yyyy-MM-dd */ public static String getSundayOfThisWeek() { SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1; if (day_of_week == 0) day_of_week = 7; c.add(Calendar.DATE, -day_of_week + 7); return df2.format(c.getTime()); } /** * 获取当月第一天 * @return */ public static String getFristDayOfMonth() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // 获取前月的第一天 Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, 0); c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 String first = format.format(c.getTime()); return format.format(c.getTime()); } /** * 获取当月最后一天 */ public static String getLastDayOfMonth(){ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // 获取前月的第一天 Calendar ca = Calendar.getInstance(); ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH)); return format.format(ca.getTime()); } public static int getSignYear(){ Calendar ca = Calendar.getInstance(); if(getNowMonth()>=4){ return getNowYear(); } return getNowYear()-1; } /** * 计算预产期 * 末次月经开始日期(第一天),月份+9,日期+7 * @param date * @return */ public static Date getDueDate(Date date){ Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.MONTH,9); cal.add(Calendar.DAY_OF_YEAR,7); return cal.getTime(); } /** * 计算产检时间 * @param date * @param day * @return */ public static Date getPrenatalInspectorDate(Date date,Integer day){ Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.DAY_OF_YEAR,day); return cal.getTime(); } /** * 转换日期字符串为Timestamp YYYY-MM-DD HH:MM:SS * @return */ public static Timestamp fomrmatStringToTimeStamp(String dateStr){ Timestamp ts = Timestamp.valueOf(dateStr); return ts; } /** * 获取当前时间的Timestamp * @return */ public static Timestamp getNowTimestamp(){ Date date = new Date(); Timestamp nousedate = new Timestamp(date.getTime()); return nousedate; } /** * 获取周一 * @return */ public static String getSundayOfThisDate(Date date) { SimpleDateFormat df2 = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS); return df2.format(getSundayOfThisDateToDate(date)); } /** * 得到本周周日 * * @return yyyy-MM-dd */ public static Date getSundayOfThisDateToDate(Date date) { Calendar c = Calendar.getInstance(); c.setTime(date); int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1; if (day_of_week == 0) day_of_week = 7; c.add(Calendar.DATE, -day_of_week + 7); return c.getTime(); } }