自己用到过的时间方法
package com.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Locale; /** * 操作时间、日期的工具类 */ public class DateUtil { public static SimpleDateFormat daydf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public static SimpleDateFormat ym = new SimpleDateFormat("yyyy-MM"); private DateUtil(){} /** * 格式化字符串为日期 * @param day 字符串格式为yyyy-MM-dd * @return 日期 Date对象 */ public static java.util.Date formatDayTime(String day){ try { return sdf.parse(day); } catch (ParseException ex) { ex.printStackTrace(); return new java.util.Date(); } } public static Date formatToDate(String day){ try { return daydf.parse(day); } catch (ParseException ex) { ex.printStackTrace(); return new java.util.Date(); } } /** * 格式字符串为某年某月的第一天。 * @param yearmonth 格式为2008-10 * @return 某年某月的第一天 */ public static java.util.Date formatMonthTime(String yearmonth){ try { return sdf.parse(yearmonth + "-01"); } catch (ParseException ex) { ex.printStackTrace(); return new java.util.Date(); } } /** * * @return * @throws ParseException */ public static String lastDayOfMonth(String yearMonth) throws ParseException{ Calendar calendar=Calendar.getInstance(); Calendar cpcalendar=(Calendar)calendar.clone(); cpcalendar.setTime(ym.parse(yearMonth)); cpcalendar.add(Calendar.MONTH, 1); cpcalendar.add(Calendar.DATE, -1); String date = sdf.format(cpcalendar.getTime()); return date; } /** * 获取当前月有多少天 * @return */ public static int getDayOfMonth(){ Calendar c = Calendar.getInstance(Locale.CHINA); int countDay = c.getActualMaximum(Calendar.DATE); return countDay; } /** *返回自1970年1月1日00:00:00GMT以来此日期对象表示的毫秒数 *@param str 格式为yyyy-MM-dd */ public static long parseDayByYYYYMMDD(String str){ try { return sdf.parse(str).getTime(); } catch (Exception ex) { return 0L; } } /** *返回自1970年1月1日00:00:00GMT以来此时间对象表示的秒数 *@param str 格式为yyyy-MM-dd HH:mm:ss */ public static int parseTimeByYYYYMMDDHHMMSS(String str){ if(str == null || str.length() != 19) return 0; try { return (int)(daydf.parse(str).getTime()/1000L); } catch (Exception ex) { return 0; } } /** * 得到 yyyy-MM-dd 格式的指定日期的前一天 */ public static String foreDay(String day){ Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(parseDayByYYYYMMDD(day)); cal.add(Calendar.DAY_OF_MONTH, -1); return sdf.format(cal.getTime()); } /** * 根据时间值构造日期 */ public static String parseDay(int time){ return sdf.format(new java.util.Date(time*1000L)); } /** * 显示时间 * @param millseconds 毫秒数 * @return 时间显示 */ public static String displayTime(long millseconds) { if(millseconds < 1000) return millseconds+" ms"; int seconds = (int)(millseconds/1000); if(seconds < 60) return seconds+" s"; if(seconds < 60*60) return seconds/60+"m"+seconds%60+"s"; int m = seconds -(seconds/3600)*3600; if(seconds < 24*60*60) return seconds/3600+"h"+m/60+"m"+m%60+"s"; return millseconds+" ms"; } /** * 转换成yyyy-MM-dd格式的日期字符串 * @param d Date对象 */ public static String formatDay(java.util.Date d){ return sdf.format(d); } /** * 转换成yyyy-MM-dd格式的日期字符串 * @param d Calendar对象 */ public static String formatDay(java.util.Calendar d){ return sdf.format(d.getTime()); } /** * 转换成yyyy-MM-dd HH:mm:ss格式的时间 * @param time 毫秒数 */ public static String formatyyyyMMddHHmmss(long time){ return daydf.format(new java.util.Date(time)); } /** * 转换成yyyy-MM-dd HH:mm:ss格式的时间 * @param time 毫秒数 */ public static String formatyyyyMMdd(long time){ return sdf.format(new java.util.Date(time)); } /** * 将时间转换成yyyy-MM-dd HH:mm:ss的格式字符串。 * @param time 时间对象 * @return 格式化后的字符串,当输入为null时输出为"" */ public static String formatyyyyMMddHHmmss(Date time){ if(time==null){ return ""; } try{ return daydf.format(time); } catch(Exception ex){ return ""; } } /** * 当前日期 * @return yyyy-MM-dd格式的当前日期 */ public static String today() { return sdf.format(new java.util.Date()); } /** * 当前日期的前一天 * @return 当前日期的前一天 */ public static String yesterday(){ java.util.Calendar cal =java.util.Calendar.getInstance(); cal.add(java.util.Calendar.DAY_OF_MONTH, -1); return sdf.format(cal.getTime()); } /** * 当前日期的下一天 * @return 当前日期的下一天 */ public static String tomorrow(){ java.util.Calendar cal =java.util.Calendar.getInstance(); cal.add(java.util.Calendar.DAY_OF_MONTH, 1); return sdf.format(cal.getTime()); } /** * 返回本月1号 * @return 返回本月1号 */ public static String currmonth1day(){ java.util.Calendar cal =java.util.Calendar.getInstance(); cal.set(java.util.Calendar.DAY_OF_MONTH, 1); return sdf.format(cal.getTime()); } /** * 返回本月最后一天 */ public static String lastDayOfMonth(){ Calendar calendar=Calendar.getInstance(); Calendar cpcalendar=(Calendar)calendar.clone(); cpcalendar.set(Calendar.DAY_OF_MONTH,1); cpcalendar.add(Calendar.MONTH, 1); cpcalendar.add(Calendar.DATE, -1); String date = sdf.format( new Date(cpcalendar.getTimeInMillis())); return date; } /** * 给指定时间加上一个数值 * @param time1 要加上一数值的时间,为null即为当前时间,格式为yyyy-MM-dd HH:mm:ss * @param addpart 要加的部分:年月日时分秒分别为:YMDHFS * @param num 要加的数值 * @return 新时间,格式为yyyy-MM-dd HH:mm:ss */ public static String addTime(String time1,String addpart,int num){ try{ String now = daydf.format(new Date()); time1 = (time1 == null) ? now : time1; if (time1.length() < 19){ time1 += " 00:00:00"; } GregorianCalendar cal = new GregorianCalendar(); cal.setTime(daydf.parse(time1)); if (addpart.equalsIgnoreCase("Y")){ cal.add(Calendar.YEAR,num); }else if (addpart.equalsIgnoreCase("M")){ cal.add(Calendar.MONTH,num); }else if (addpart.equalsIgnoreCase("D")){ cal.add(Calendar.DATE,num); }else if (addpart.equalsIgnoreCase("H")){ cal.add(Calendar.HOUR,num); }else if (addpart.equalsIgnoreCase("F")){ cal.add(Calendar.MINUTE,num); }else if (addpart.equalsIgnoreCase("S")){ cal.add(Calendar.SECOND,num); } return daydf.format(cal.getTime()); } catch(Exception e){ throw new RuntimeException(e); } } /** * 给指定日期加上一个数值 * @param date1 要加上一数值的日期,为null即为当前日期,格式为yyyy-MM-dd * @param addpart 要加的部分:年月日分别为:YMD * @param num 要加的数值 * @return 新日期,格式为yyyy-MM-dd */ public static String addDate(String date1,String addpart,int num){ return addTime(date1,addpart,num).substring(0,10); } /** * 当前日期 * @return yyyy-MM-dd HH:mm:ss格式的当前日期 */ public static String now() { return daydf.format(new java.util.Date()); } /** * 返回当前时间 */ public static String timeofnow(){ Calendar curcal = Calendar.getInstance(); return daydf.format(curcal.getTime()); } /** * 得到距离当前天几天的日期表达,格式为1985-12-20。 * @param step 天数。例如-10表示十天前 * @return */ public static String dateofSepcial(int step) { java.util.Calendar cal = java.util.Calendar.getInstance(); cal.add(java.util.Calendar.DAY_OF_MONTH, step); return sdf.format(cal.getTime()); } /** * UNIX时间x * @return */ public static String getCurrUnixtimestamp(){ String ret = ""; try { Date date = daydf.parse("1970-01-01 00:00:00"); long l = (new Date().getTime() - date.getTime())/1000; ret = String.valueOf(l); } catch (Exception e) { e.printStackTrace(); } return ret; } /** * 比较时间大小,精确到时分秒 */ public static boolean compareDateYYYYMMDDHHmmss(String date1, String date2) { try { Date dt1 = daydf.parse(date1); Date dt2 = daydf.parse(date2); if (dt1.getTime() >= dt2.getTime()) { return true; } else if (dt1.getTime() < dt2.getTime()) { return false; } } catch (Exception e) { e.printStackTrace(); } return false; } /** * 比较时间大小,精确到天 */ public static boolean compareDateYYYYMMDD(String date1, String date2) { try { Date dt1 = sdf.parse(date1); Date dt2 = sdf.parse(date2); if (dt1.getTime() >= dt2.getTime()) { return true; } else if (dt1.getTime() < dt2.getTime()) { return false; } } catch (Exception e) { e.printStackTrace(); } return false; } /** * 计算两日期的差的天数 * @param smdate 开始日期 * @param bdate 结束日期 */ public static int daysBetween(String smdate,String bdate) { int num = 0; try { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd"); Calendar cal = Calendar.getInstance(); cal.setTime(sdf.parse(smdate)); long time1 = cal.getTimeInMillis(); cal.setTime(sdf.parse(bdate)); long time2 = cal.getTimeInMillis(); long between_days=(time2-time1)/(1000*3600*24); num = Integer.parseInt(String.valueOf(between_days)); } catch (Exception e) { e.printStackTrace(); } return num; } /** * 获取传入时间,所在年的周数 * @param date * @return */ public static int getWeekOfYear(String dateStr) { //简单时间格式话类 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd"); try { Date date = simpleDateFormat.parse(dateStr); Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setMinimalDaysInFirstWeek(7); c.setTime(date); return c.get(Calendar.WEEK_OF_YEAR); } catch (ParseException e) { e.printStackTrace(); } return 1; } /** * 获取当前年的最大周数 * @param year * @return */ public static int getMaxWeekNumOfYear(int year) { //简单时间格式话类 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd"); Calendar c = new GregorianCalendar(); c.set(year, Calendar.DECEMBER, 31, 23, 59, 59); return getWeekOfYear(simpleDateFormat.format(c.getTime())); } /** * 获取某年的第几周的开始日期 * @param year * @param week * @return */ public static String getFirstDayOfYearOrWeek(int year, int week) { //简单时间格式话类 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd"); Calendar c = new GregorianCalendar(); c.set(Calendar.YEAR, year); c.set(Calendar.MONTH, Calendar.JANUARY); c.set(Calendar.DATE, 1); Calendar cal = (GregorianCalendar) c.clone(); cal.add(Calendar.DATE, week * 7); return getFirstDayOfWeek(simpleDateFormat.format(cal.getTime())); } /** * 获取当前时间所在周的开始日期 * @param dateStr * @return */ public static String getFirstDayOfWeek(String dateStr) { //简单时间格式话类 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd"); try { //将字符串格式话为时间 Date date = simpleDateFormat.parse(dateStr); Calendar c = new GregorianCalendar(); c.setFirstDayOfWeek(Calendar.MONDAY); c.setTime(date); c.set(Calendar.DAY_OF_WEEK, c.getFirstDayOfWeek()); //Monday return simpleDateFormat.format(c.getTime()); } catch (ParseException e) { e.printStackTrace(); } return null; } /** * 获取输入时间,相同周数、相同星期几、去年的日期 * @param thisDate * @return */ public static String getPastWeekEqualDate(String thisDate){ //简单时间格式话类 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); try { date = simpleDateFormat.parse(thisDate); } catch (ParseException e) { e.printStackTrace(); } Calendar cal = Calendar.getInstance(); //设置时间 cal.setTimeInMillis(date.getTime()); //获取当前年份 int year = cal.get(Calendar.YEAR); //获取当前在今年的周数 int startTimeWeek = DateUtil.getWeekOfYear(thisDate); //获取当前日期所在周的开始日期 String thisWeekDate = DateUtil.getFirstDayOfYearOrWeek(year,startTimeWeek); //计算输入日期与所在周第一天的差值 int insertDiffer =DateUtil.daysBetween(thisWeekDate,thisDate); //获取去年的最大周树 int pastYearMaxWeek = DateUtil.getMaxWeekNumOfYear(year-1); //如果去年没有当前周,则周数减1 if(startTimeWeek > pastYearMaxWeek){ startTimeWeek = startTimeWeek -1; } //获取去年的同周数的,第一天 String paseYearWeekOneDdy = DateUtil.getFirstDayOfYearOrWeek(year-1,startTimeWeek); //得到去年相同周数的相同的日期 String pastWeekStartDate = DateUtil.addDate(paseYearWeekOneDdy, "D", insertDiffer); return pastWeekStartDate; } /** * 测试 */ public static void main(String[] args) throws ParseException { String thisDate = "2015-07-29"; //简单时间格式话类 SimpleDateFormat simpleDateFormat =new SimpleDateFormat("yyyy-MM-dd"); Date date = simpleDateFormat.parse(thisDate); Calendar cal = Calendar.getInstance(); //设置时间 cal.setTimeInMillis(date.getTime()); //获取当前年份 int year = cal.get(Calendar.YEAR); //获取当前在今年的周数 int startTimeWeek = DateUtil.getWeekOfYear(thisDate); System.out.println("当前周数:" + startTimeWeek); //获取去年的最大周树 int pastYearMaxWeek = DateUtil.getMaxWeekNumOfYear(year-1); System.out.println("去年最大周数:" + pastYearMaxWeek); //如果去年没有当前周,则周数减1 if(startTimeWeek > pastYearMaxWeek){ startTimeWeek = startTimeWeek -1; } //获取当前日期所在周的开始日期 String thisWeekDate = DateUtil.getFirstDayOfYearOrWeek(year,startTimeWeek); System.out.println("当前日期所在周的第一天日期:" + thisWeekDate); //获取去年的同周数的,第一天 String paseYearWeekOneDdy = DateUtil.getFirstDayOfYearOrWeek(year-1,startTimeWeek); System.out.println("去年相同周岁的第一天日期:" + paseYearWeekOneDdy); //计算输入时间所在的周,与当前周的第一天的天数差 int insertDiffer =DateUtil.daysBetween(thisWeekDate,thisDate); System.out.println("输入日期和输入日期所在周的第一天相差天数:" + insertDiffer); //得到去年相同周数的相同的日期 String pastWeekDate = DateUtil.addDate(paseYearWeekOneDdy, "D", insertDiffer); System.out.println("去年相同周岁相同日期:" + pastWeekDate); } }