package com.lizard.fastdb.util; import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; /** * 日期操作工具类,用于各种日期的获取和转换 * * @author SHEN.GANG */ public class DateUtils { /** * 转换long型(秒数)日期格式为字符型日期,精确到时分秒,如:convertTimeToString( 1264834129 ) -->2012-01-30 14:48:49 * @param longTime 需要转换的long型日期 * @return 格式为yyyy-MM-dd HH:mm:ss的字符型日期 */ public static String convertTimeToString(long longTime) { return convertTimeToString(longTime, "yyyy-MM-dd HH:mm:ss"); } /** * 转换long型(秒数)日期格式为字符型日期,日期格式通过 format 定义,如:convertTimeToString( 1264834129 ,"yyyy-MM-dd" ) --> 2012-01-30 * @param longTime 需要转换的long型日期 * @param format 日期格式 年:yyyy 月:MM 日:dd 小时:HH 分钟:mm 秒:ss * @return 格式为yyyy-MM-dd HH:mm:ss的字符型日期 */ public static String convertTimeToString(long longTime, String format) { try { Timestamp t = new Timestamp(longTime * 1000); SimpleDateFormat sDateFormat = new SimpleDateFormat(format); return sDateFormat.format(t); } catch (Exception ex) { throw new RuntimeException("Can't format the time by format["+format+"]!"); } } /** * 转换字符型日期(精确到时分秒)为long型日期(秒数),如:convertTimeToLong( "2013-01-30 14:48:49" )--> 1264834129 * @param dateTime 需要转换的Str型日期 * @return long型日期 */ public static long convertTimeToLong(String dateTime) { return convertTimeToLong(dateTime, "yyyy-MM-dd HH:mm:ss"); } /** * 转换字符型日期(日期格式通过format定义)为long型日期(秒数),如:convertTimeToLong( "2012-01-30","yyyy-MM-dd" ) --> 1264780800 * @param dateTime 需要转换的Str型日期 * @param format 日期格式 年:yyyy 月:MM 日:dd 小时:HH 分钟:mm 秒:ss * @return long型日期 */ public static long convertTimeToLong(String dateTime, String format) { SimpleDateFormat sdf = new SimpleDateFormat(format); long date = 0; try { Date d = sdf.parse(dateTime); date = d.getTime() / 1000; } catch (Exception ex) { throw new RuntimeException("Can't format the time by format["+format+"]!"); } return date; } /** * 获取当前时间的long型值(秒数)。 * @return long型日期 */ public static long getCurrentLongTime() { return System.currentTimeMillis() / 1000; } /** * 获取当前时间字符串表示,精确到时分秒,如:2013-01-30 14:48:49 * @return 字符型日期 */ public static String getCurrentTime() { return getCurrentTime("yyyy-MM-dd HH:mm:ss"); } /** * 获取当前时间字符串表示,日期格式由format定义,如:getCurrentTime("yyyy-MM-dd") --> 2013-01-30 * @param format 日期格式 年:yyyy 月:MM 日:dd 小时:HH 分钟:mm 秒:ss"; * @return 日期字符串 */ public static String getCurrentTime(String format) { try { SimpleDateFormat sdf = new SimpleDateFormat(format); return sdf.format(new Date()); } catch (Exception e) { throw new RuntimeException("Can't format the time by format["+format+"]!"); } } /** * 获取2个日期之间间隔的天数,如:getDayByDateToDate("2009-12-1","2009-9-29"); --> -63 * @param startDate 起始时间 * @param endDate 结束时间 * @return 间隔天数(long型) */ public static long getDayBetweenDateAndDate(String startDate, String endDate) { SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); long day = 0; try { Date date = myFormatter.parse(endDate); Date mydate = myFormatter.parse(startDate); day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); } catch (Exception ex) { throw new RuntimeException("Time format["+startDate+"]["+endDate+"] is error ! format must be 'yyyy-MM-dd'!"); } return day; } /** * 根据日期获取是星期几 0,1,2,3,4,5,6 分别对应 礼拜日,礼拜一,礼拜二,礼拜三,礼拜四,礼拜五,礼拜六 * @return 0-6 */ public static int getWeekday(String dateTime) { SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = myFormatter.parse(dateTime); Calendar cal = Calendar.getInstance(); cal.setTime(date); return cal.get(Calendar.DAY_OF_WEEK) - 1< 0 ? 0 : cal.get(Calendar.DAY_OF_WEEK) - 1; } catch (ParseException e) { throw new RuntimeException("Time format["+dateTime+"] is error ! format must be 'yyyy-MM-dd'!"); } } /** * 获得上周一的日期字符串 * @return 上周星期一的日期字符串 */ public static String getPreWeekFirstDay() { Calendar cd = Calendar.getInstance(); int week= cd.get(Calendar.DAY_OF_WEEK) == 1 ? 8 : cd.get(Calendar.DAY_OF_WEEK); int mondayPlus = week - 1 == 1 ? 0 : 1 - (week - 1); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus - 7); Date monday = currentDate.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(monday); } /** * 获得上周日的日期字符串 * @return 上周星期日的日期字符串 */ public static String getPreWeekLastDay() { Calendar cd = Calendar.getInstance(); int week= cd.get(Calendar.DAY_OF_WEEK) == 1 ? 8 : cd.get(Calendar.DAY_OF_WEEK); int mondayPlus = week - 1 == 1 ? 0 : 1 - (week - 1); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus -1); Date monday = currentDate.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(monday); } /** * 获得下周一的日期字符串 * @return 下周星期一的日期字符串 */ public static String getNextWeekFirstDay() { Calendar cd = Calendar.getInstance(); int week= cd.get(Calendar.DAY_OF_WEEK) == 1 ? 8 : cd.get(Calendar.DAY_OF_WEEK); int mondayPlus = week - 1 == 1 ? 0 : 1 - (week - 1); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7); Date monday = currentDate.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(monday); } /** * 获得下周日的日期字符串 * @return 下周星期日的日期字符串 */ public static String getNextWeekLastDay() { Calendar cd = Calendar.getInstance(); int week= cd.get(Calendar.DAY_OF_WEEK) == 1 ? 8 : cd.get(Calendar.DAY_OF_WEEK); int mondayPlus = week - 1 == 1 ? 0 : 1 - (week - 1); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 + 6); Date monday = currentDate.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(monday); } /** * 获得本周一的日期字符串 * @return 本周星期一的日期字符串 */ public static String getWeekFirstDay() { Calendar cd = Calendar.getInstance(); int week= cd.get(Calendar.DAY_OF_WEEK) == 1 ? 8 : cd.get(Calendar.DAY_OF_WEEK); int mondayPlus = week - 1 == 1 ? 0 : 1 - (week - 1); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus); Date monday = currentDate.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(monday); } /** * 获得本周日的日期字符串 * @return 本周星期日的日期字符串 */ public static String getWeekLastDay() { Calendar cd = Calendar.getInstance(); int week= cd.get(Calendar.DAY_OF_WEEK) == 1 ? 8 : cd.get(Calendar.DAY_OF_WEEK); int mondayPlus = week - 1 == 1 ? 0 : 1 - (week - 1); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 6); Date monday = currentDate.getTime(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(monday); } /** * 获取上个月第一天日期字符串 * @return 上个月第一天日期字符串 */ public static String getPreMonthFirstDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1); lastDate.add(Calendar.MONTH, -1); str = sdf.format(lastDate.getTime()); return str; } /** * 获取上个月最后一天日期字符串 * @return 上个月最后一天日期字符串 */ public static String getPreMonthLastDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, -1); lastDate.set(Calendar.DATE, 1); lastDate.roll(Calendar.DATE, -1); str = sdf.format(lastDate.getTime()); return str; } /** * 获取本月第一天日期字符串 * @return 本月第一天日期字符串 */ public static String getMonthFirstDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1); str = sdf.format(lastDate.getTime()); return str; } /** * 获取本月最后一天日期字符串 * @return 本月最后一天日期字符串 */ public static String getMonthLastDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1); lastDate.add(Calendar.MONTH, 1); lastDate.add(Calendar.DATE, -1); str = sdf.format(lastDate.getTime()); return str; } /** * 获取下个月第一天日期字符串 * @return 下个月第一天日期字符串 */ public static String getNextMonthFirstDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, 1); lastDate.set(Calendar.DATE, 1); str = sdf.format(lastDate.getTime()); return str; } /** * 获取下个月最后一天日期字符串 * @return 下个月最后一天日期字符串 */ public static String getNextMonthLastDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, 1); lastDate.set(Calendar.DATE, 1); lastDate.roll(Calendar.DATE, -1); str = sdf.format(lastDate.getTime()); return str; } /** * 换取指定日期前多少天后多少天的日期,如DateUtils.getBeforeAfterDate("2013-02-08",-1)-->2013-02-07 * @param dateTime 日期字符串 * @param day 相对天数,为正数表示之后,为负数表示之前 * @return 指定日期字符串n天之前或者之后的日期 */ public static String getBeforeAfterDate(String dateTime, int day) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date oldDate = null; try { df.setLenient(false); oldDate = new Date(df.parse(dateTime).getTime()); } catch (ParseException e) { throw new RuntimeException("Time format["+dateTime+"] is error ! format must be 'yyyy-MM-dd'!"); } Calendar cal = new GregorianCalendar(); cal.setTime(oldDate); int Year = cal.get(Calendar.YEAR); int Month = cal.get(Calendar.MONTH); int Day = cal.get(Calendar.DAY_OF_MONTH); int NewDay = Day + day; cal.set(Calendar.YEAR, Year); cal.set(Calendar.MONTH, Month); cal.set(Calendar.DAY_OF_MONTH, NewDay); Date date = new Date(cal.getTimeInMillis()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(date); } }