package com.amarsoft.aims.util; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import com.amarsoft.are.ARE; import com.amarsoft.are.lang.DateX; /** * 统一时间日期获取处理类
* 主要考虑统一获取日期,方便统一和外围系统联调及其他时间时,引起的取系统时间引起的不一致问题 * @author yangsong * @since 2014/06/19 */ public class DateTool { public static final String AMR_NOMAL_DATE_FORMAT = "yyyy/MM/dd"; /** * 获取当前日期,yyyy/MM/dd格式 * @return */ public static String getCurDate(){ return getBaseDate().getDateString(); } public static String getCurSeason(){ Calendar cal = Calendar.getInstance(); int month = cal.get(Calendar.MONTH); String returnValue = ""; switch((int)(month/3)){ case 0 : returnValue = "第一季度"; break; case 1 : returnValue = "第二季度"; break; case 2 : returnValue = "第三季度"; break; case 3 : returnValue = "第四季度"; break; } return returnValue; } public static String getCurDateTime(){ return getBaseDate().getDateString("yyyy/MM/dd HH:mm:ss"); } public static String getCurDateTime(String format){ return getBaseDate().getDateString(format); } /** * 设置日期格式 * @return */ public static String dateFormat(String date){ DateX dateX = new DateX(date); return dateX.getDateString("yyyy年MM月dd日"); } /** * 获取基础日期, * @return */ public static DateX getBaseDate(){ DateX dateX = new DateX(new Date()); // DateX dateX = new DateX("2014/06/24 19:18:08"); return dateX; } public static final String INTERVAL_SEASON = "season"; public static final String INTERVAL_MONTH = "month"; /** * 获取下一个间隔日期 * @param invervalType 间隔类型,如下个月,下个季度 * @param defaultDate 月内日期设定 * @return */ public static Date nextIntervalDate (String invervalType, int defaultDate){ Calendar cal = Calendar.getInstance(); int month = cal.get(Calendar.MONTH); int interval = 0; if(invervalType.equals(INTERVAL_SEASON) ){ interval = (month/3+1)*3 - month; }else if(invervalType.equals(INTERVAL_MONTH)){ interval=1; } cal.add(Calendar.MONTH, interval); cal.set(Calendar.DATE, defaultDate); //cal.roll(Calendar.DATE, defaultDate-1); return cal.getTime(); } /** * 获取下一个间隔日期 返回字符串yyyy/MM/dd格式 * @param invervalType * @param defaultDate * @return */ public static String nextIntervalDateStr (String invervalType, int defaultDate){ DateX dateX = new DateX(nextIntervalDate(invervalType,defaultDate)); return dateX.getDateString(); } /** * 根据特定的月日,获取当前时间的下一个该日期 * @param defaultMonth * @param defaultDate * @return */ public static Date getNextDate(int defaultMonth , int defaultDate){ Calendar cal = Calendar.getInstance(); if(cal.get(Calendar.MONTH) +1 >defaultMonth || (cal.get(Calendar.MONTH) +1 ==defaultMonth && cal.get(Calendar.DATE)>=defaultDate)){ cal.add(Calendar.YEAR, 1); } cal.set(Calendar.MONTH, defaultMonth-1); cal.set(Calendar.DATE, defaultDate); return cal.getTime(); } /** * 根据特定的月日,获取当前时间的下一个该日期 返回字符串yyyy/MM/dd格式 * @param defaultMonth * @param defaultDate * @return */ public static String getNextDateString(int defaultMonth , int defaultDate){ DateX dateX = new DateX(getNextDate(defaultMonth,defaultDate)); return dateX.getDateString(); } /** * 根据年份,季度数获取日期区间 * 举例:若当前时间2014/08/06 * 1.year=2014 seasonCount=2 则 区间为 2014/04/01 - 2014/08/06 * 2.year=2014 seasonCount=4 则 区间为 2013/10/01 - 2014/08/06 * 2.year=2013 seasonCount=2 则 区间为 2013/07/01 - 2013/12/31 * @param year * @param seasonCount * @return */ public static String[] getDateRange(int year ,int seasonCount){ String start="",end=""; Calendar cal = Calendar.getInstance(); int nowYear = cal.get(Calendar.YEAR); if(nowYear>year){ cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, 12); cal.set(Calendar.DATE, 31); } end = new DateX(cal.getTime()).getDateString(); cal.add(Calendar.MONTH, -((seasonCount-1)*3+cal.get(Calendar.MONTH)%3)); cal.set(Calendar.DATE, 1); start = new DateX(cal.getTime()).getDateString(); return new String[]{start,end}; } /** * 获取一年中的某一季度的日期范围 * @param year 年份 * @param season 该年中的季度:1~4 * @return */ public static String[] getRangeForSeason(int year ,int season){ String start="",end=""; Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, year); cal.set(Calendar.MONTH, season*3-3); cal.set(Calendar.DATE, 1); start = new DateX(cal.getTime()).getDateString(); cal.set(Calendar.MONTH, season*3-1); cal.set(Calendar.DATE, (season==1 ||season==4) ? 31:30); end = new DateX(cal.getTime()).getDateString(); return new String[]{start,end}; } /** * 把日期类型转化成字符串类型 * @param date * @param format 输出的字符串日期格式 * @return */ public static String parseDate2String(Date date, String format){ return DateX.format(date, format); } /** * 把日期类型转化成字符串类型 * @param date * @return */ public static String parseDate2String(Date date){ return DateX.format(date, AMR_NOMAL_DATE_FORMAT); } /** * 获取当前日期的日历 * @param date * @param format 输入的字符串日期格式 * @return * @throws Exception */ public static Calendar getCalendar(String date, String format) { Calendar cal = Calendar.getInstance(); cal.clear(); try { cal.setTime(new SimpleDateFormat(format).parse(date)); } catch (ParseException e) { ARE.getLog("输入日期的格式不正确!").error(e); } return cal; } /** * 把字符串类型转化成日期类型 * @param date * @param format 输入的字符串日期格式 * @return * @throws ParseException */ public static Date parseString2Date(String date, String format) { return getCalendar(date, format).getTime(); } /** * 把字符串类型转化成日期类型,默认格式为yyyy/MM/dd * @param date * @return * @throws ParseException */ public static Date parseString2Date(String date) { return parseString2Date(date, AMR_NOMAL_DATE_FORMAT); } /** * 按给定期限单位进行日期加减 * @param date * @param year * @param month * @param day * @param format * @return */ public static String getRelativeDate(Date date, int year, int month, int day, String format) { SimpleDateFormat sdf = new SimpleDateFormat(format); GregorianCalendar gc = new GregorianCalendar(); gc.setTime(date); gc.add(1, year); gc.add(2, month); gc.add(5, day); return sdf.format(gc.getTime()); } /** * 按给定期限单位进行日期加减 * @param date * @param year * @param month * @param day * @return */ public static String getRelativeDate(String date, int year, int month, int day) { return getRelativeDate(parseString2Date(date), year, month, day, AMR_NOMAL_DATE_FORMAT); } /** * 判断两个日期的大小 * @param dateFir * @param dateSec * @return * 1 dateFir 晚于 dateSec * -1 dateFir 早于 dateSec * 0 dateFir 等于 dateSec * @throws ParseException */ public static int compareDate(String dateFir, String dateSec){ Date date1d = parseString2Date(dateFir); Date date2d = parseString2Date(dateSec); if (date1d.after(date2d)) return 1; if (date1d.before(date2d)) return -1; else return 0; } /** * 根据日期获取星期几 * @param date * @param type 1 返回数字 2 返回中文 3 返回英文 * @return * @throws ParseException */ public static String getWeekDay(String date, String type){ String[] weekDates = { "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六" }; String[] weekDatesE = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" }; Calendar cal = getCalendar(date, AMR_NOMAL_DATE_FORMAT); if (type.equals("2")) return weekDates[cal.get(Calendar.DAY_OF_WEEK) - 1]; else if (type.equals("3")) return weekDatesE[cal.get(Calendar.DAY_OF_WEEK) - 1]; else return String.valueOf(cal.get(Calendar.DAY_OF_WEEK) - 1); } /** * 获取月末日期 * @param curDate * @return * @throws ParseException */ public static String getMonthLastDate(String curDate){ Calendar calendar = Calendar.getInstance(); calendar.setTime(parseString2Date(curDate)); calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); return parseDate2String(calendar.getTime()); } /** * 获取季末日期 * @param curDate * @return * @throws ParseException */ public static String getSeasonLastDate(String curDate){ String months[] = {"03","06","09","12"}; Calendar cal = Calendar.getInstance(); cal.setTime(parseString2Date(curDate)); int dateMonth = cal.get(Calendar.MONTH); int dateYear = cal.get(Calendar.YEAR); String lastMonth = ""; switch((int)(dateMonth/3)){ case 0 : lastMonth = months[0]; break; case 1 : lastMonth = months[1]; break; case 2 : lastMonth = months[2]; break; case 3 : lastMonth = months[3]; break; } String newDate = dateYear+"/"+lastMonth+"/01"; return getMonthLastDate(newDate); } /** * 获取季初日期 * @param curDate * @return * @throws ParseException */ public static String getSeasonBeginDate(String curDate){ String months[] = {"01","04","07","10"}; Calendar cal = Calendar.getInstance(); cal.setTime(parseString2Date(curDate)); int dateMonth = cal.get(Calendar.MONTH); int dateYear = cal.get(Calendar.YEAR); String lastMonth = ""; switch((int)(dateMonth/3)){ case 0 : lastMonth = months[0]; break; case 1 : lastMonth = months[1]; break; case 2 : lastMonth = months[2]; break; case 3 : lastMonth = months[3]; break; } String newDate = dateYear+"/"+lastMonth+"/01"; return newDate; } }