package net.caiban.utils; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; /** * 格式定义如下: y 年号,如 1996 M 月份,如 July 或者 07 d 月中第几天,如 12 H 小时(24制),如 0、17 m 分钟,如 32 s 钞钟,如55 S 微钞,如978 E 星期几,如 Tuesday D * 一年中的第几天,如 189 w week in year (Number) 27 W week in month (Number) 2 a am/pm marker (Text) PM k hour in day (1~24) * (Number) 24 K hour in am/pm (0~11) (Number) 0 z time zone (Text) Pacific Standard Time ' escape for text (Delimiter) * '' single quote (Literal) ' * * @throws ParseException * 用法: DateUtil.getTimeStrByLongTime(1000L * 60L * 60L * 25L * 30L * 12L) 1年15天 <br> * DateUtil.toString(new Date(),"yyyy年MM月dd日HH时mm分ss秒") 2007年12月27日10时49分52秒 <br> * DateUtil.toString(DateUtil.getDate(new Date(),"yyyy-MM-DD"),"yyyy年MM月dd日HH时mm分ss秒") 2007年12月27日00时00分00秒 <br> * DateUtil.toString(DateUtil.getDate("2005-1-1","yyyy-MM-DD" ),"yyyy年MM月dd日HH时mm分ss秒") 2005年01月01日00时00分00秒 <br> * DateUtil.toString(DateUtil.getDateAfterDays(new Date(),-10),"yyyy年MM月dd日HH时mm分ss秒") 2007年12月17日10时49分52秒 <br> * DateUtil.toString(DateUtil.getDateAfterMonths(new Date(),-2),"yyyy年MM月dd日HH时mm分ss秒") 2007年10月27日10时49分52秒 <br> * DateUtil.toString(new Date(12345222),"yyyy年MM月dd日HH时mm分ss秒") 1970年01月01日11时25分45秒 <br> */ public class DateUtil { /** * desc:Date转换为String * * @param date * 需要转换的date * @param format * 格式字符串 * @return 返回按照格式转化后的字符串 DateUtil.toString(new Date(),"yyyy-MM-dd HH:mm:ss SSS") */ public static String toString(Date date, String format) { if (date != null) { SimpleDateFormat dateformatter = new SimpleDateFormat(format); String dateString = dateformatter.format(date); return dateString; } else { return null; } } /** * desc:Date时间转换为格式化后的Date时间 * * @param date * 需要转换的date * @param format * 格式字符串 * @return 返回按照格式转化后的Date 如:DateUtil.getDate(new Date(),"yyyy-MM-dd") */ public static Date getDate(Date date, String format) throws ParseException { if (date == null) return null; SimpleDateFormat dateformatter = new SimpleDateFormat(format); return dateformatter.parse(dateformatter.format(date)); } /** * desc:String时间转换为格式化Date时间 * * @param date * 需要转换的String * @param format * 格式字符串 * @return 返回按照格式转化后的Date 如:DateUtil.getDate("2007-11-01","yyyy-MM-dd") */ public static Date getDate(String dateStr, String format) throws ParseException { SimpleDateFormat dateformatter = new SimpleDateFormat(format); return dateformatter.parse(dateStr); } /** * desc:String时间转换为格式化Date时间 * * @param date * 需要转换的String * @param format * 格式字符串 * @param locale * 特定地区 * @return 返回按照格式转化后的Date 如:DateUtil.getDate("2007-11-01","yyyy-MM-dd",Locale.ENGLISH) */ public static Date getDate(String dateStr, String format, Locale locale) throws ParseException { SimpleDateFormat dateformatter = new SimpleDateFormat(format, locale); return dateformatter.parse(dateStr); } /** * desc:获得距今天一定时间后的时间 * * @param date * 转换前的时间 * @param field * 增减单位 * @param add_days * 增减数量 * @return 返回增减单位后的Date 如:DateUtil.getDateAfter(new Date(),Calendar.MONTH,-2) 2个月前的时间 */ public static Date getDateAfter(Date date, int field, int add_days) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(field, add_days); return calendar.getTime(); } /** * desc:获得格式化时间,时间为距几天天数 * * @param date * 转换前的时间 * @param add_days * 天数 * @return 返回增加天数之后的Date 如:DateUtil.getDateAfterDays(new Date(),-1) 一天前的时间 */ public static Date getDateAfterDays(Date date, int add_days) { Calendar time = Calendar.getInstance(); time.setTime(date); time.add(Calendar.DATE, add_days); return time.getTime(); } /** * desc:获得格式化时间,时间为距今天月数 * * @param date * 转换前的时间 * @param add_months * 月数 * @return 返回增减月数后的Date 如:DateUtil.getDateAfterMonths(new Date(),-2) 2个月前的时间 */ public static Date getDateAfterMonths(Date date, int add_months) { Calendar time = Calendar.getInstance(); time.setTime(date); time.add(Calendar.MONTH, add_months); return time.getTime(); } /** * desc:获得用时时间,12000=12秒 * * @param time_misec * 毫秒数 * @return 返回用时时间字符串 如:DateUtil.getTimeStrByLongTime(12010) 12秒10毫秒 */ public static String getTimeStrByLongTime(long time_misec) { StringBuffer bu = new StringBuffer(20); long parent = time_misec; long leav = parent % 1000; if (leav != 0) { bu.insert(0, leav + "毫秒"); } long child = parent / 1000; if (child == 0) { return bu.toString(); } leav = child % 60; if (leav != 0) { bu.insert(0, leav + "秒"); } child = child / 60; if (child == 0) { return bu.toString(); } leav = child % 60; if (leav != 0) { bu.insert(0, leav + "分钟"); } child = child / 60; if (child == 0) { return bu.toString(); } leav = child % 24; if (leav != 0) { bu.insert(0, leav + "小时"); } child = child / 24; if (child == 0) { return bu.toString(); } leav = child % 30; if (leav != 0) { bu.insert(0, leav + "天"); } child = child / 30; if (child == 0) { return bu.toString(); } leav = child % 12; if (leav != 0) { bu.insert(0, leav + "月"); } child = child / 12; if (child == 0) { return bu.toString(); } bu.insert(0, child + "年"); return bu.toString(); } /** * desc:获取相距时间time参数为年月日时分秒的时间 * * @param int...time 年月日时分秒顺序输入参数,允许部分参数 * @return 返回时间 如:DateUtil.getTimeAfterTime(2007,12,26) */ public static Date getTimeAfterTime(int... time) { Calendar now = new GregorianCalendar(); if ((time == null) || (time.length == 0)) { return now.getTime(); } int len = time.length; int[] times = time; for (int i = 0; i < len; i++) { switch (i) { case 0: now.add(Calendar.YEAR, times[i]); break; case 1: now.add(Calendar.MONTH, times[i]); break; case 2: now.add(Calendar.DATE, times[i]); break; case 3: now.add(Calendar.HOUR, times[i]); break; case 4: now.add(Calendar.MINUTE, times[i]); case 5: now.add(Calendar.SECOND, times[i]); break; } } return now.getTime(); } /** * desc:获取上月第一天的时间 * * @return 返回上月第一天的时间 如:DateUtil.getLastMonthFistDay() */ public static Date getLastMonthFistDay() { Calendar now = new GregorianCalendar(); now.add(Calendar.MONTH, -1); Calendar stdCal = new GregorianCalendar(now.get(Calendar.YEAR), now.get(Calendar.MONTH), 1); return stdCal.getTime(); } /** * desc:获取本月第一天的时间 * * @return 返回本月第一天的时间 如:DateUtil.getNowMonthFirstDay() */ public static Date getNowMonthFirstDay() { Calendar now = new GregorianCalendar(); int curYear = now.get(Calendar.YEAR); int curMonth = now.get(Calendar.MONTH); Calendar stdCal = new GregorianCalendar(curYear, curMonth, 1); return stdCal.getTime(); } /** * @return 精确到秒的时间截,long格式 */ public static long getSecTimeMillis() { return System.currentTimeMillis() / 1000l; } /** * @param day * 与当前日期的天数差,+X表示后面X天,-X表示前面X天,0表示今天 * @return 返回与今天相差day天的零点的时间截,精确到秒 */ public static long getTheDayZero(int day) { Calendar calendar = Calendar.getInstance(); // 当前日期 calendar.add(Calendar.DATE, day); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); return calendar.getTime().getTime() / 1000l; } public static long getTheDayZero(Date day,int intervalDays) { Calendar calendar = Calendar.getInstance(); // 当前日期 calendar.setTime(day); calendar.add(Calendar.DATE, intervalDays); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); return calendar.getTime().getTime() / 1000l; } //获取指定日期的年份 public static int getYearForDate(Date day) { Calendar calendar = Calendar.getInstance(); calendar.setTime(day); return calendar.get(Calendar.YEAR); } //获取指定日期的月份 从1开始,默认为0 public static int getMonthForDate(Date day) { Calendar calendar = Calendar.getInstance(); calendar.setTime(day); return calendar.get(Calendar.MONTH)+1; } //获取指定日期在月份中的天序列 public static int getDayOfMonthForDate(Date day) { Calendar calendar = Calendar.getInstance(); calendar.setTime(day); return calendar.get(Calendar.DAY_OF_MONTH); } //获取指定日期的星期序列(星期日开始) public static int getDayOfWeekForDate(Date day) { Calendar calendar = Calendar.getInstance(); calendar.setTime(day); return calendar.get(Calendar.DAY_OF_WEEK); } /** * @param date * @return 返回指定日期时间的时间截 如:DateUtil.getMillis(new Date()); */ public static long getMillis(Date date) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); return calendar.getTimeInMillis(); } public static void main(String[] args) throws ParseException { // String[] ids = TimeZone.getAvailableIDs(-8 * 60 * 60 * 1000); // // if no ids were returned, something is wrong. get out. // if (ids.length == 0) // System.exit(0); // // // begin output // System.out.println("Current Time"); // // // create a Pacific Standard Time time zone // SimpleTimeZone pdt = new SimpleTimeZone(-8 * 60 * 60 * 1000, ids[0]); // // // set up rules for daylight savings time // pdt.setStartRule(Calendar.APRIL, 1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); // pdt.setEndRule(Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000); // // // create a GregorianCalendar with the Pacific Daylight time zone // // and the current date and time Calendar calendar = new GregorianCalendar(); System.out.println(Calendar.getInstance().getClass().getName()); System.out.println(calendar.getClass().getName()); Date trialTime = getDate("2011-01-01", "yyyy-MM-dd"); calendar.setTime(trialTime); // print out a bunch of interesting things System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println(toString(trialTime, "yyyy-MM-dd")); //calendar.add(Calendar.DATE, -calendar.get(Calendar.DAY_OF_WEEK) + 1); System.out.println(toString(calendar.getTime(), "yyyy-MM-dd")); System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); System.out.println("Current Time, with hour reset to 3"); calendar.clear(Calendar.HOUR_OF_DAY); // so doesn't override calendar.set(Calendar.HOUR, 3); System.out.println("ERA: " + calendar.get(Calendar.ERA)); System.out.println("YEAR: " + calendar.get(Calendar.YEAR)); System.out.println("MONTH: " + calendar.get(Calendar.MONTH)); System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR)); System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH)); System.out.println("DATE: " + calendar.get(Calendar.DATE)); System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH)); System.out.println("DAY_OF_YEAR: " + calendar.get(Calendar.DAY_OF_YEAR)); System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK)); System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH)); System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM)); System.out.println("HOUR: " + calendar.get(Calendar.HOUR)); System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY)); System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE)); System.out.println("SECOND: " + calendar.get(Calendar.SECOND)); System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND)); System.out.println("ZONE_OFFSET: " + (calendar.get(Calendar.ZONE_OFFSET) / (60 * 60 * 1000))); // in hours System.out.println("DST_OFFSET: " + (calendar.get(Calendar.DST_OFFSET) / (60 * 60 * 1000))); // in hours System.out.println(toString(new Date(getTheDayZero(new Date(),0)*1000),"yyyy-MM-dd HH:mm:ss")); //System.out.println(DateUtil.getIntervalDays(DateUtil.getDate("2014-02-14", "yyyy-MM-dd"), DateUtil.getDate("2012-11-13", "yyyy-MM-dd"))); } /** * 判断是否润年 * * <pre> * 1.被400整除是闰年 * 2.能被4整除同时不能被100整除则是闰年 * </pre> * * @param year * @return */ public static boolean isLeapYear(Integer year) { return (year % 400) == 0 || ((year % 4) == 0 && (year % 100) != 0); } /** * 比较两个日期相差的天数(非严格意义上的天,忽略小时和分) * * @param fDate * 较新的日期 * @param oDate * 较老的日期 * @return * @throws ParseException */ public static int getIntervalDays(Date fDate, Date oDate) throws ParseException { String fDate1 = toString(fDate, "yyyyMMdd"); String oDate1 = toString(oDate, "yyyyMMdd"); java.text.SimpleDateFormat df = new java.text.SimpleDateFormat("yyyyMMdd"); java.util.Date cDate = df.parse(fDate1); java.util.Date dDate = df.parse(oDate1); return (int) ((cDate.getTime() - dDate.getTime()) / (24 * 60 * 60 * 1000)); } /** * 得到本周第一天 * * @return date */ public static Date getFirstDateThisWeek() { Calendar cal = Calendar.getInstance(); int day_of_week = cal.get(Calendar.DAY_OF_WEEK) - 2; cal.add(Calendar.DATE, -day_of_week); return cal.getTime(); } /** * 得到本周最后一天 * * @return date */ public static Date getLastDateThisWeek() { Calendar cal = Calendar.getInstance(); cal.add(Calendar.DATE, 6); return cal.getTime(); } public static int getIntervalMonths(Date date1, Date date2) { int iMonth = 0; int flag = 0; try { Calendar objCalendarDate1 = Calendar.getInstance(); objCalendarDate1.setTime(date1); Calendar objCalendarDate2 = Calendar.getInstance(); objCalendarDate2.setTime(date2); if (objCalendarDate2.equals(objCalendarDate1)) return 0; if (objCalendarDate1.after(objCalendarDate2)) { Calendar temp = objCalendarDate1; objCalendarDate1 = objCalendarDate2; objCalendarDate2 = temp; } if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) < objCalendarDate1 .get(Calendar.DAY_OF_MONTH)) flag = 1; if (objCalendarDate2.get(Calendar.YEAR) > objCalendarDate1 .get(Calendar.YEAR)) iMonth = ((objCalendarDate2.get(Calendar.YEAR) - objCalendarDate1 .get(Calendar.YEAR)) * 12 + objCalendarDate2.get(Calendar.MONTH) - flag) - objCalendarDate1.get(Calendar.MONTH); else iMonth = objCalendarDate2.get(Calendar.MONTH) - objCalendarDate1.get(Calendar.MONTH) - flag; } catch (Exception e) { e.printStackTrace(); } return iMonth; } public static Date getMondayFirstOfWeek(Date baseDate){ int dayofweek = getDayOfWeekForDate(baseDate); dayofweek=dayofweek==1?dayofweek+7:dayofweek; return getDateAfterDays(baseDate, 2-dayofweek); } }