摘要:功能描述日期處理工具類基于主要功能日期校驗獲取系統當前日期可自定義系統日期判斷閏年獲取連個日期之間的天數,月數判定日期的前后將字符串轉換為或等日期格式默認修改日志當前操作系統日期日期格式默認時間格式默認年月日時分秒靜態初始化默認系統當前
package datasource; import java.text.DateFormat; import java.text.ParseException; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Map; import java.util.TimeZone; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 功能描述:日期處理工具類(基于Calendar) 主要功能:日期校驗;獲取系統當前日期(可自定義系統日期);判斷閏年;獲取連個日期之間的天數,月數; * 判定日期的前后;將字符串轉換為Date或Calendar等... 日期格式默認:yyyyMMdd * * @author dhcc WangShanfang * @date 2008-11-21 * @see null * @修改日志:1.0 */ public class DateUtil extends Object { /** * 當前操作系統日期 Calendar. */ private static Calendar calendar = new GregorianCalendar(TimeZone .getDefault()); /** * 日期格式 默認:yyyyMMdd */ private static String pattern = "yyyyMMdd"; /** * 時間格式 默認:HH:mm:ss */ private static String timePattern = "HH:mm:ss"; /** * 年 */ private static int year = 0; /** * 月 */ private static int month = 0; /** * 日 */ private static int day = 0; /** * 時 */ private static int hour = 0; /** * 分 */ private static int minute = 0; /** * 秒 */ private static int second = 0; /** * 靜態初始化(默認系統當前日期和時間) */ static { year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH) + 1; day = calendar.get(Calendar.DAY_OF_MONTH); hour = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); second = calendar.get(Calendar.SECOND); } /** * 構造方法 */ public DateUtil() { // Do Nothing } /** * 功能描述:自定義系統時間。(謹慎使用) * * @param strdate * 自定義日期字符串,格式:yyyymmdd * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static void setSysDate(String strdate) { if (isDateStr(strdate)) { calendar = parseCalendar(strdate); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH) + 1; day = calendar.get(Calendar.DAY_OF_MONTH); hour = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); second = calendar.get(Calendar.SECOND); } } /** * 功能描述: 初始化系統日期(當前系統日期)調用setSysDate()后會用到次方法重新初始化系統日期時間 為當前日期時間 * * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static void initSys() { calendar = new GregorianCalendar(TimeZone.getDefault()); year = calendar.get(Calendar.YEAR); month = calendar.get(Calendar.MONTH) + 1; day = calendar.get(Calendar.DAY_OF_MONTH); hour = calendar.get(Calendar.HOUR_OF_DAY); minute = calendar.get(Calendar.MINUTE); second = calendar.get(Calendar.SECOND); } /** * 功能描述:獲取系統當前日期---年 * * @return int 年 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static int getYear() { return year; } /** * 功能描述:獲取系統當前日期---年 * * @return String 年 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static String getStrYear() { return String.valueOf(year); } /** * 功能描述:獲取系統當前日期---月 * * @return int 月 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static int getMonth() { return month; } public static int getYear(String strDate) { SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd"); Date startDate; int intYear = 0; try { startDate = f.parse(strDate); Calendar starCal = Calendar.getInstance(); starCal.setTime(startDate); intYear = starCal.get(Calendar.YEAR); } catch (ParseException e) { e.printStackTrace(); } return intYear; } public static int getMonth(String strDate) { SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd"); Date startDate; int intMonth = 0; try { startDate = f.parse(strDate); Calendar starCal = Calendar.getInstance(); starCal.setTime(startDate); intMonth = starCal.get(Calendar.MONTH) + 1; } catch (ParseException e) { e.printStackTrace(); } return intMonth; } /** * * 方法描述:將短時間格式字符串轉換為時間 yyyy-MM-dd * @param strDate 日期 YYYYMMDD * @return * Date * @author XieZhenGuo * @date 2013-1-5 上午11:36:36 */ public static String shotToDate(String strDate) { String strtodate=strDate.substring(0, 4)+"-"+strDate.substring(4, 6)+"-"+strDate.substring(6); return strtodate; } /** * * 方法描述: 將短時間格式字符串轉換為時間 HH:mm:ss * @param strTime 時間 HHmmss * @return * String * @author XieZhenGuo * @date 2013-1-5 上午11:44:01 */ public static String shotToTime(String strTime) { String strtodate=strTime.substring(0, 2)+":"+strTime.substring(2, 4)+":"+strTime.substring(4); return strtodate; } /** * 功能描述:獲取系統當前日期---月 * * @return String 月 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static String getStrMonth() { return month >= 10 ? String.valueOf(month) : "0" + String.valueOf(month); } /** * 功能描述:獲取系統當前日期---日 * * @return int 日 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static int getDay() { return day; } /** * 功能描述:獲取系統當前日期---日 * * @return String 日 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static String getStrDay() { return day < 10 ? "0" + String.valueOf(day) : String.valueOf(day); } /** * * 功能描述:獲取系統時間--小時 * * @return int * @author wangshanfang * @date 2008-11-24 * @修改日志:1.0 */ public static int getHour() { return hour; } /** * * 功能描述:獲取系統時間--分鐘 * * @return int * @author wangshanfang * @date 2008-11-24 * @修改日志: */ public static int getMinute() { return minute; } /** * * 功能描述:獲取系統時間--秒 * * @return int * @author wangshanfang * @date 2008-11-24 * @修改日志: */ public static int getSecond() { return second; } /** * 功能描述:獲取系統當前日期---年月日 (格式:yyyymmdd) * * @return String 年月日 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static String getDate() { Calendar calendar1 = new GregorianCalendar(TimeZone .getDefault()); SimpleDateFormat format = new SimpleDateFormat(pattern); Date date = calendar1.getTime(); return format.format(date); } /** * 功能描述:根據預定格式取系統當前日期---年月日 * * @param ptn * 日期格式 * @return String * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static String getDate(String ptn) { SimpleDateFormat format = new SimpleDateFormat(ptn); Date date = calendar.getTime(); return format.format(date); } /** * 功能描述:獲取系統時間 格式:yyyymmdd hh:mm:ss * * @return String * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static String getDateTime() { SimpleDateFormat format = new SimpleDateFormat(pattern + " " + timePattern); Date date = calendar.getTime(); return format.format(date); } /** * * 功能描述:獲取預定義格式的系統時間 * * @param datePtn * 日期格式 * @param timePtn * 時間格式 * @return String * @author wangshanfang * @date 2008-11-24 * @修改日志:1.0 */ public static String getDateTime(String datePtn, String timePtn) { SimpleDateFormat format = new SimpleDateFormat(datePtn + " " + timePtn); Date date = calendar.getTime(); return format.format(date); } /** * 功能描述:判斷給定日期(格式yyyymmdd)是否在系統日期之前,是(或等于):true,否:false * * @param strdate * 給定日期 * @return boolean * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static boolean isBefore(String strdate) { Calendar cal = parseCalendar(strdate); return cal.before(calendar); } /** * * 功能描述:判斷給定的兩個日期的前后。strdate1在strdate2之前(或同一天),返回true,反之,false * * @param strdate1 * 日期1 * @param strdate2 * 日期2 * @return boolean * @author wangshanfang * @date 2008-11-25 * @修改日志:1.0 */ public static boolean isBefore(String strdate1, String strdate2) { Calendar cal1 = parseCalendar(strdate1); Calendar cal2 = parseCalendar(strdate2); return cal1.before(cal2); } /** * * 功能描述:計算在當前系統日期增加或減少 n 天后的日期 * * @param days * 增加或減少的天數,正數增加,反之減少 * @author wangshanfang * @date 2008-11-24 * @修改日志: */ public static String addByDay(int days) { Calendar calendar1 = new GregorianCalendar(TimeZone .getDefault()); calendar1.add(Calendar.DATE, days); SimpleDateFormat format = new SimpleDateFormat(pattern); Date date = calendar1.getTime(); return format.format(date); } /** * * 功能描述:計算在給定的日期加上或減去 n 天后的日期 * * @param datestr * 給定的日期 * @param days * 正數增加,反之減少 * @return String * @author wangshanfang * @date 2008-11-24 * @修改日志: */ public static String addByDay(String datestr, int days) { Calendar cal = parseCalendar(datestr); cal.add(Calendar.DATE, days); SimpleDateFormat format = new SimpleDateFormat(pattern); Date date = cal.getTime(); return format.format(date); } /** * * 功能描述:計算在給定的日期加上或減去 n 天后的日期 * * @param datestr * 給定的日期 * @param days * 正數增加,反之減少 * @param days * 格式 yyyyMMdd/yyyy-MM-dd * @return String * @author wangshanfang * @date 2008-11-24 * @修改日志: */ public static String addByDay(String datestr, int days,String pattern) { Calendar cal = parseCalendar(datestr); cal.add(Calendar.DATE, days); SimpleDateFormat format = new SimpleDateFormat(pattern); Date date = cal.getTime(); return format.format(date); } public static String addBySecond(String datestr, int seconds,String pattern) { Calendar cal = parseCalendar(datestr); cal.add(Calendar.SECOND, seconds); SimpleDateFormat format = new SimpleDateFormat(pattern); Date date = cal.getTime(); return format.format(date); } /** * * 功能描述:在給定日期上加月加天 后的日期 * * @param datestr * 合同起始日 * @param months * 增加月 * @param days * 增加天 * @return * @author dhcc lizhiyu * @date Nov 25, 2009 * @修改日志: * */ public static String addByMonth(String datestr, int months, int days) { Calendar cal = parseCalendar(datestr); cal.add(Calendar.MONTH, months); cal.add(Calendar.DATE, days); SimpleDateFormat format = new SimpleDateFormat(pattern); Date date = cal.getTime(); return format.format(date); } /** * * 功能描述:獲得給定日期與系統當前日期之間的天數 * * @param strdate * 給定的日期字符串 * @return long 天數 * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static long getDays(String strdate) { Calendar cal = parseCalendar(strdate); Calendar cal1 = parseCalendar(getDate()); long millis = Math.abs(cal.getTimeInMillis() - cal1.getTimeInMillis()); return millis / (24L * 60L * 60L * 1000L); } /** * * 功能描述:獲得給定的兩個日期之間相差的天數(日期不分前后) * * @param fromdate * 日期字符串 格式:yyyymmdd * @param todate * 日期字符串 格式:yyyymmdd * @return long * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static long getDaysBetween(String fromdate, String todate) { Calendar from = parseCalendar(fromdate); Calendar to = parseCalendar(todate); long millis = Math.abs(from.getTimeInMillis() - to.getTimeInMillis()); return millis / (24L * 60L * 60L * 1000L); } /** * * 功能描述:獲得給定日期與系統當前日期之間的月數,不記天數 * * @param strdate * 給定的日期字符串 * @return long 月數 * @author wangshanfang * @date 2008-11-21 * @修改日志:待定 */ private static long getMonths(String strdate) { long months = getMonth() - Integer.parseInt(strdate.substring(4, 6)); long years = getYear() - Integer.parseInt(strdate.substring(0, 4)); if (!isBefore(strdate)) { months = -months; years = -years; } if (months >= 0) { return years * 12 + months; } else { return (years - 1) * 12 + months + 12; } } /** * * 功能描述:獲得給定日期與系統當前日期之間的月數和天數 * * @param strdate * 給定的日期字符串 * @return long[] 下標0月數,1天數 * @author wangshanfang * @date 2008-11-21 * @修改日志:待定 */ public static long[] getMonthsAndDays(String strdate) { long m = getMonths(strdate); int d = getDay() - Integer.parseInt(strdate.substring(6, 8)); String date = ""; if (!isBefore(strdate)) { d = -d; date = strdate; } else { date = getDate(); } while (d < 0) { m--; d += getDaysOfMonth(date); } long[] md = { m, d }; return md; } /** * * 功能描述:獲得給定兩個日期之間的月數和天數 * * @param strdate1 * @param strdate2 * @return long[] 下標0月數,1天數 * @author wangshanfang * @date 2008-11-25 * @修改日志: */ public static long[] getMonthsAndDays(String strdate1, String strdate2) { long[] md = new long[2] ; try { int monthnum = getMonths(strdate1,strdate2); String tempEndDate= addByMonth(strdate1,monthnum , 0); Long days= getDays(tempEndDate,strdate2,"yyyyMMdd"); md[0]=monthnum; md[1]=days; tempEndDate=null; days=null; } catch (Exception e) { e.printStackTrace(); } return md; } /** * 功能描述:判斷字符串是否可以轉換為日期型 是:true,否:false * * @param strdate * 預轉換字符串 * @return boolean * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static boolean isDateStr(String strdate) { if (strdate.length() != 8) { return false; } String reg = "^(d{4})((0([1-9]{1}))|(1[012]))((0[1-9]{1})|([1-2]([0-9]{1}))|(3[0|1]))$"; if (Pattern.matches(reg, strdate)) { reg=null; return getDaysOfMonth(strdate) >= Integer.parseInt(strdate .substring(6, 8)); } else { return false; } } /** * 功能描述:判斷是否是閏年(年限1000--9999)是:true,否:false * * @param strdate * 預判斷年 格式yyyymmdd 或 yyyy * @return boolean * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static boolean isLeapYear(String strdate) { int y = Integer.parseInt(strdate.substring(0, 4)); if (y <= 999) { return false; } if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) { return true; } else { return false; } } /** * 功能描述:獲取某一月份的天數 * * @param strdate * 日期 格式:yyyymmdd 或 yyyymm * @return int * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static int getDaysOfMonth(String strdate) { int m = Integer.parseInt(strdate.substring(4, 6)); switch (m) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 4: case 6: case 9: case 11: return 30; case 2: if (isLeapYear(strdate)) { return 29; } else { return 28; } default: return 0; } } /** * 功能描述:把字符串轉換為Calendar * * @param strdate * 預轉換的字符串 * @return Calendar * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static Calendar parseCalendar(String strdate) { if (isDateStr(strdate)) { int year = Integer.parseInt(strdate.substring(0, 4)); int month = Integer.parseInt(strdate.substring(4, 6)) - 1; int day = Integer.parseInt(strdate.substring(6, 8)); return new GregorianCalendar(year, month, day); } else { return null; } } /** * 功能描述:將字符串轉換為Date型日期 日期格式yyyymmdd * * @param strdate * 預轉換的字符串 * @return Date * @author wangshanfang * @date 2008-11-21 * @修改日志:1.0 */ public static Date parseDate(String strdate) { SimpleDateFormat format = new SimpleDateFormat(pattern); Date d = null; try { d = format.parse(strdate); } catch (Exception pe) { pe.printStackTrace(); } return d; } /** * * 功能描述:查詢下幾個月的今天 * * @param date * 輸入的期限 * @param i * 要查詢第幾個月后的今天的日期 * @return 下幾個月日期 * @author dhcc gouqifeng * @date Nov 2, 2009 * @修改日志: * */ public static String getRepayDay(String date, int val) { int year = Integer.parseInt(date.substring(0, 4)); int month = Integer.parseInt(date.substring(4, 6)); int day = Integer.parseInt(date.substring(6, 8)); String riqi = ""; int reapyMonth = 0; if ((month + val) % 12 == 0) { // 如 月加上輸入的月取模==0 則把初始化的月 賦值=12 reapyMonth = 12; } else { // 否則把除以12 的余數賦值個月參數上 reapyMonth = (month + val) % 12; } year += (month + val - 1) / 12; // 原先的月數+輸入的要查詢的月數 -1/12 如果和 是13 年加1 if (reapyMonth <= 9) { riqi = year + "0" + reapyMonth + date.substring(6, 8); } else { riqi = year + "" + reapyMonth + date.substring(6, 8); } if (getDaysOfMonth(riqi) < day) { // 查詢日期的日 < 當期日期的日 該日期 如 20090130 的 // 下個月的期限是多少 ,日應該 是28, 因為不是閏年 riqi = riqi.substring(0, 6) + DateUtil.getDaysOfMonth(riqi);// 這樣 // 就截取 // 對應的日期加上 // 該月應該有的日期是多少就對了,2,4,6,8 // 等 // 小月的日期就對了 } return riqi; } // public static void main(String args []){ // DateUtil du=new DateUtil(); // } /** * * @名稱 isBetween * @描述 判斷是否在開始日期和結束日期之間 * @作者 liupei * @時間 Mar 15, 2011 11:47:58 AM * @參數 begin 開始日期 end 結束日期 betweenValue 中間值 DateFormat 日期格式 boundaryValue * 是否包括邊界值 */ public static boolean isBetween(String begin, String end, String betweenValue, String DateFormat, boolean boundaryValue) { boolean flag = false; SimpleDateFormat dateFormat = new SimpleDateFormat(DateFormat); try { Date beginDate = dateFormat.parse(begin); Date endDate = dateFormat.parse(end); Date betweenDate = dateFormat.parse(betweenValue); if (betweenDate.after(beginDate) && betweenDate.before(endDate)) { flag = true; } if (boundaryValue) { if (betweenDate.compareTo(beginDate) == 0) { flag = true; } if (betweenDate.compareTo(endDate) == 0) { flag = true; } } } catch (ParseException e) { e.printStackTrace(); } return flag; } /** * * @名稱 addDay * @描述 給一個日期添加或減少幾天 * @作者 liupei * @時間 Mar 16, 2011 9:29:34 AM * @param tempdate需要操作的日期變量 * @param days需要添加幾天,正數表示添加幾天,負數表示減少幾天 * @param format日期格式 */ public static String addDay(String tempdate, int days, String format) { int year = Integer.parseInt(tempdate.substring(0, 4)); int month = 0; int day = 0; String s_month = tempdate.substring(4, 6); String s_day = tempdate.substring(6, 8); if ("0".equals(s_month.substring(0, 1))) { month = Integer.parseInt(tempdate.substring(5, 6)); } else { month = Integer.parseInt(tempdate.substring(4, 6)); } if ("0".equals(s_day.substring(0, 1))) { day = Integer.parseInt(tempdate.substring(7, 8)); } else { day = Integer.parseInt(tempdate.substring(6, 8)); } GregorianCalendar firstFlight = new GregorianCalendar(year, month - 1, day); DateFormat df = new SimpleDateFormat(format); Date date = firstFlight.getTime(); Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.add(Calendar.DAY_OF_MONTH, days); return df.format(cal.getTime()); } /** * * @名稱 getDays * @功能 如果結束日期小余開始日期返回-1 相等返回0否則返回兩個日期之間的天數 * @作者 乾之軒 * @時間 Mar 18, 2011 8:15:42 PM * @param begin開始日期 * @param end結束日期 * @param format日期格式 */ public static long getDays(String begin, String end, String format) { long datanumber = 0; SimpleDateFormat df = new SimpleDateFormat(format); long l_end; long l_begin; try { l_end = df.parse(end).getTime(); l_begin = df.parse(begin).getTime(); long temp = l_end - l_begin; datanumber = temp / (1000L * 60L * 60L * 24L); } catch (ParseException e) { e.printStackTrace(); } if (datanumber < 0) { datanumber = -1; } return datanumber; } /** * * @名稱 isAfter * @功能 判斷end是不是在begin之后.是返回true不是返回false * @作者 乾之軒 * @時間 Mar 21, 2011 11:03:13 AM * @param begin開始日期 * @param end結束日期 * @param format日期格式 * @return boolean * */ public static boolean isAfter(String begin, String end, String format) { boolean flag = false; SimpleDateFormat dateFormat = new SimpleDateFormat(format); try { Date beginDate = dateFormat.parse(begin); Date endDate = dateFormat.parse(end); flag = endDate.after(beginDate); } catch (ParseException e) { e.printStackTrace(); } return flag; } /** * * 方法描述: begin > end 返回 -1,begin = end 返回 0,begin < end 返回 1. * @param begin * @param end * @param format * @return * int * @author luanhaowei * @date 2012-6-5 下午07:27:04 */ public static int compareTo(String begin, String end, String format) { SimpleDateFormat dateFormat = new SimpleDateFormat(format); int flag=0; try { Date beginDate = dateFormat.parse(begin); Date endDate = dateFormat.parse(end); flag = endDate.compareTo(beginDate); } catch (ParseException e) { e.printStackTrace(); } return flag; } /** * * @名稱 getDaysOfYear * @功能 獲得一年的天數 * @作者 乾之軒 * @時間 Mar 21, 2011 11:03:13 AM * @param year * 年 * @return boolean * */ public static String getDaysOfYear(String year) { if (isLeapYear(year)) { return "366"; } else { return "365"; } } /** * 驗證日期格式是否符合xxxx-xx-xx這種格式(只驗證格式,不驗證日期是否正確) * * @param date * 日期字符串 * @return 符合:true 不符合:false * @author yxdong */ public static boolean testDate(String date) { boolean isDate = false; Pattern pattern = Pattern.compile("^d{4}(-)d{2}(-)d{2}$"); Matcher matcher = pattern.matcher(date); isDate = matcher.matches(); return isDate; } /** * * @名稱 isFullMonth * @描述 判斷2個日期之間的間隔是不是整月 如2011-01-02和2011-03-02是整月 2011-12-31和2011-4-30 是整月 * @作者 乾之軒 * @時間 Dec 1, 2011 3:39:09 PM */ public static boolean isFullMonth(String begin, String end, String format) { return getMonthsAndDays(begin,end)[1]>0?false:true; } /** * * @名稱 isLastDayOfMonth * @描述 判斷兩個日期是否都是月末 * @參數 @param begin * @參數 @param end * @參數 @param format * @參數 @return * @返回值 boolean * @作者 luanhaowei * @時間 2012-4-13 上午11:24:48 */ public static boolean isLastDayOfMonth(String begin, String end, String format) { boolean result = false; if (isLastDayOfMonth(begin, format) && isLastDayOfMonth(end, format)) { result = true; } return result; } /** * * @名稱 getMonth * @描述 判斷2個日期相差的月數 * @作者 乾之軒 * @時間 Dec 1, 2011 4:57:49 PM */ public static int getMonth(String begin1, String end1, String format) throws ParseException { SimpleDateFormat dateFormat = new SimpleDateFormat(format); Date s = dateFormat.parse(begin1); Date e = dateFormat.parse(end1); if (s.after(e)) { Date t = s; s = e; e = t; } Calendar start = Calendar.getInstance(); start.setTime(s); Calendar end = Calendar.getInstance(); end.setTime(e); Calendar temp = Calendar.getInstance(); temp.setTime(e); temp.add(Calendar.DATE, 1); int y = end.get(Calendar.YEAR) - start.get(Calendar.YEAR); int m = end.get(Calendar.MONTH) - start.get(Calendar.MONTH); if ((start.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) == 1)) {// 前后都不破月 return y * 12 + m + 1; } else if ((start.get(Calendar.DATE) != 1) && (temp.get(Calendar.DATE) == 1)) {// 前破月后不破月 return y * 12 + m; } else if ((start.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) != 1)) {// 前不破月后破月 return y * 12 + m; } else {// 前破月后破月 return (y * 12 + m - 1) < 0 ? 0 : (y * 12 + m - 1); } } /** * * @名稱 getDay * @描述 判斷2個日期相差的天數數 * @作者 乾之軒 * @時間 Dec 1, 2011 4:58:29 PM */ public static int getDay(String begin1, String end1, String format) throws ParseException { SimpleDateFormat dateFormat = new SimpleDateFormat(format); Date s = dateFormat.parse(begin1); Date e = dateFormat.parse(end1); if (s.after(e)) { Date t = s; s = e; e = t; } Calendar start = Calendar.getInstance(); start.setTime(s); Calendar end = Calendar.getInstance(); end.setTime(e); Calendar temp = Calendar.getInstance(); temp.setTime(e); temp.add(Calendar.DATE, 1); if ((start.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) == 1)) {// 前后都不破月 return 0; } else if ((start.get(Calendar.DATE) != 1) && (temp.get(Calendar.DATE) == 1)) {// 前破月后不破月 return getDayP(start); } else if ((start.get(Calendar.DATE) == 1) && (temp.get(Calendar.DATE) != 1)) {// 前不破月后破月 return end.get(Calendar.DATE); } else {// 前破月后破月 if (start.get(Calendar.MONTH) == end.get(Calendar.MONTH) && start.get(Calendar.YEAR) == end.get(Calendar.YEAR)) { return end.get(Calendar.DATE) - start.get(Calendar.DATE) + 1; } else { return getDayP(start) + end.get(Calendar.DATE); } } } public static int getDayP(Calendar s) { int d; if (s.get(Calendar.MONTH) == 1 && s.get(Calendar.YEAR) % 4 == 0 && s.get(Calendar.YEAR) % 100 != 0) {// 閏年2月 d = 29; } else { Mapm = new HashMap (); m.clear(); m.put(1, 31); m.put(3, 31); m.put(5, 31); m.put(7, 31); m.put(8, 31); m.put(10, 31); m.put(12, 31); m.put(4, 30); m.put(6, 30); m.put(9, 30); m.put(11, 30); m.put(2, 28); d = m.get(s.get(Calendar.MONTH) + 1); } return d - s.get(Calendar.DATE); } @SuppressWarnings("static-access") static String GetSysDate(String format, String StrDate, int year, int month, int day) { Calendar cal = Calendar.getInstance(); SimpleDateFormat sFmt = new SimpleDateFormat(format); cal.setTime(sFmt.parse((StrDate), new ParsePosition(0))); if (day != 0) { cal.add(cal.DATE, day); } if (month != 0) { cal.add(cal.MONTH, month); } if (year != 0) { cal.add(cal.YEAR, year); } return sFmt.format(cal.getTime()); } /********************************************************************/ public static int getMonths(String begin, String end) { int iMonth = 0; int flag = 0; SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd"); try { Date date1 = dateFormat.parse(begin); Date date2 = dateFormat.parse(end); 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.DAY_OF_MONTH) == 30 && objCalendarDate1.get(Calendar.DAY_OF_MONTH) == 31 && objCalendarDate2.get(Calendar.YEAR) >= objCalendarDate1.get(Calendar.YEAR)) flag = 0;// 草川禾 20110120 添加 處理特殊情況 此處是唯一一種 // 即結束日期是30天,開始日期日31時計劃日期[)情況 if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) == 28 && objCalendarDate1.get(Calendar.DAY_OF_MONTH) == 31 && objCalendarDate2.get(Calendar.YEAR) >= objCalendarDate1.get(Calendar.YEAR)) flag = 0;// 草川禾 20110120 添加 處理特殊情況 此處是唯一一種 // 即結束日期是30天,開始日期日31時計劃日期[)情況 if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) == 28 && objCalendarDate1.get(Calendar.DAY_OF_MONTH) == 29 && objCalendarDate2.get(Calendar.YEAR) >= objCalendarDate1.get(Calendar.YEAR)) flag = 0;// 處理getMonthsAndDays("20120229", "20130228")這種情況 if (objCalendarDate2.get(Calendar.DAY_OF_MONTH) == 29 && objCalendarDate1.get(Calendar.DAY_OF_MONTH) == 31 && objCalendarDate2.get(Calendar.YEAR) >= objCalendarDate1.get(Calendar.YEAR)) flag = 0;// 草川禾 20110120 添加 處理特殊情況 此處是唯一一種 // 即結束日期是30天,開始日期日31時計劃日期[)情況 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; } /** * * @名稱 isLastDayOfMonth * @描述 判斷一個日期是否該月的月末 * @參數 @param beginDate * @參數 @return * @返回值 boolean * @作者 luanhaowei * @時間 2012-4-13 上午11:13:45 */ public static boolean isLastDayOfMonth(String beginDate, String format) { boolean result = false; try { SimpleDateFormat dateFormat = new SimpleDateFormat(format); Date date = dateFormat.parse(beginDate); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.set(Calendar.DATE, (calendar.get(Calendar.DATE) + 1)); if (calendar.get(Calendar.DAY_OF_MONTH) == 1) { result = true; } } catch (ParseException e) { e.printStackTrace(); } return result; } /** * * 方法描述: 獲取下個月份 * @param monStr * @return * String * @author rjq * @date Jan 18, 2014 3:27:05 PM */ public static String getNextMon(String monStr){ String result=""; int year=Integer.parseInt(monStr.substring(0,4)); int mon=Integer.parseInt(monStr.substring(4)); mon++; if(mon==13){ mon=1; year++; } if(mon>9){ result=year+""+mon; }else{ result=year+"0"+mon; } return result; } /** * * 方法描述: 獲取上個月份 * @param monStr * @return * String * @author rjq * @date Jan 18, 2014 3:27:05 PM */ public static String getPreMon(String monStr){ String result=""; int year=Integer.parseInt(monStr.substring(0,4)); int mon=Integer.parseInt(monStr.substring(4,6)); mon--; if(mon==0){ mon=12; year--; } if(mon<10){ result=year+"0"+mon; }else{ result=year+""+mon; } return result; } /** * * 方法描述: 根據類型和日期返回開始和截止日期 * @param type 查詢類型1.日;2.旬;3.月;4.季;5.半年;6.年 * @param date 傳入的查詢日期 20150317 * void * @author hly * @date 2014-10-15 上午10:59:19 */ public static String[] getDateArray(String type,String dateStr){ if(dateStr.length()==6){ dateStr+="01"; } String[] dateArray = new String[2] ; String yearStr = dateStr.substring(0,4) ; String monthStr = dateStr.substring(4,6) ; String dayStr = dateStr.substring(6,8) ; if(type.equals("1")){//日 dateArray[0] = dateStr ; dateArray[1] = dateStr ; } if(type.equals("2")){//計算旬 int d = Integer.parseInt(dayStr) ; if(d >= 1 && d <= 10){ dateArray[0] = yearStr+monthStr+"01" ; dateArray[1] = yearStr+monthStr+"10" ; } else if(d >= 11 && d <= 20){ dateArray[0] = yearStr+monthStr+"11" ; dateArray[1] = yearStr+monthStr+"20" ; } else { dateArray[0] = yearStr+monthStr+"21" ; int y = Integer.parseInt(yearStr) ; if (Integer.parseInt(monthStr) == 12){//如果本月加1等于12月則需推到下一年 y = y + 1 ; monthStr="01"; }else { int monVal=Integer.parseInt(monthStr); monVal++; if(monVal>9){ monthStr=String.valueOf(monVal); }else { monthStr="0"+monVal; } } String s = String.valueOf(y) + monthStr + "01" ; String ss = addByDay(s, -1) ;//下月第一天減去一天為本月一號 dateArray[1] = ss ; } } if(type.equals("3")){//月 int y = Integer.parseInt(yearStr) ; dateArray[0] = yearStr+monthStr+"01" ; if (Integer.parseInt(monthStr) == 12){//如果本月加1等于12月則需推到下一年 y = y + 1 ; monthStr="01"; }else { monthStr=String.valueOf(Integer.parseInt(monthStr)+1); if(Integer.parseInt(monthStr)<10){ monthStr="0"+monthStr; } } String s = String.valueOf(y) + monthStr + "01" ; String ss = addByDay(s, -1) ;//下月第一天減去一天為本月一號 dateArray[1] = ss ; } if(type.equals("4")){//季 int m = Integer.parseInt(monthStr) ; if(m >= 1 && m <= 3){ dateArray[0] = yearStr+"01"+"01" ; dateArray[1] = yearStr+"03"+"31" ; }else if(m >= 4 && m <= 6){ dateArray[0] = yearStr+"04"+"01" ; dateArray[1] = yearStr+"06"+"30" ; }else if(m >= 7 && m <= 9){ dateArray[0] = yearStr+"07"+"01" ; dateArray[1] = yearStr+"09"+"30" ; }else if(m >= 10 && m <= 12){ dateArray[0] = yearStr+"10"+"01" ; dateArray[1] = yearStr+"12"+"31" ; } } if(type.equals("5")){//半年 int m = Integer.parseInt(monthStr) ; if(m >= 1 && m <= 6){ dateArray[0] = yearStr+"01"+"01" ; dateArray[1] = yearStr+"06"+"30" ; }else if(m >= 7 && m <= 12){ dateArray[0] = yearStr+"07"+"01" ; dateArray[1] = yearStr+"12"+"31" ; } } if(type.equals("6")){//年 dateArray[0] = yearStr+"01"+"01" ; dateArray[1] = yearStr+"12"+"31" ; } return dateArray; } public static String formatDate (String dateStr){ String result=""; // DATE_FORMAT try { result=convertFormat(dateStr, "yyyyMMdd", "yyyy-MM-dd"); } catch (Exception e) { e.printStackTrace(); } return result; } public static String formatDate1 (String dateStr){ String result=""; // DATE_FORMAT try { result=convertFormat(dateStr, "yyyyMMdd", "yyyy.MM.dd"); } catch (Exception e) { e.printStackTrace(); } return result; } public static String convertFormat(String datestr, String pattern, String targetpattern) { String t_date = ""; Date t_ddate = null; SimpleDateFormat t_dateFormat = new SimpleDateFormat(pattern); try { t_ddate = t_dateFormat.parse(datestr); t_dateFormat = new SimpleDateFormat(targetpattern); t_date = t_dateFormat.format(t_ddate); } catch (ParseException e) { e.printStackTrace(); } return t_date; } /*************************************************************************** * @throws Exception **************************************************************************/ public static void main(String[] args) { //String date = formatDate("20150721"); String str ="20150909"; // if(isLastDayOfMonth("20120229", "yyyyMMdd")) { // } else { // } // try { // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66803.html
摘要:時間與日期處理從屬于筆者的現代開發系列文章,涉及到的引用資料聲明在學習與實踐資料索引中。可以通過靜態構造方法很容易的創建,定義了與之間的轉化關系時差類以年月日來表示日期差,而以秒與毫秒來表示時間差適用于處理與機器時間。 Java 時間與日期處理 從屬于筆者的現代 Java 開發系列文章,涉及到的引用資料聲明在 Java 學習與實踐資料索引中。 Java 時間與日期處理 在 Java 8...
摘要:類提供方法和方法來通知系統進行垃圾回收清理系統資源,并提供了和方法來加載文件和動態鏈接庫。返回按照標準的規定,對兩個參數進行余數運算。 與用戶互動 運行Java程序的參數 //Java程序入口:main()方法 public static void main(String[] args){...} public修飾符:Java類由JVM調用,為了讓JVM可以自由調用這個main()方...
摘要:類是一個抽象類,它為特定瞬間與一組諸如等日歷字段之間的轉換提供了一些方法,并為操作日歷字段例如獲得下星期的日期提供了一些方法。是不變的日期時間對象代表一個日期時間,往往被視為年月日時分秒。獲得實例的日期和時間。 時區 GMT(Greenwich Mean Time):格林尼治時間,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。 UTC(U...
摘要:正則表達式的概述和簡單使用正則表達式是指一個用來描述或者匹配一系列符合某個語法規則的字符串的單個字符串。例如,在表達式中,存在四個這樣的組組零始終代表整個表達式。 1_正則表達式的概述和簡單使用 A:正則表達式 是指一個用來描述或者匹配一系列符合某個語法規則的字符串的單個字符串。其實就是一種規則。有自己特殊的應用。 作用:比如注冊郵箱,郵箱有用戶名和密碼,一般會對其限制長度,這個...
摘要:前言前面一篇文章寫了如何安全的使用里面介紹了如何處理日期時間,以及如何保證線程安全,及其介紹了在中的處理時間日期默認就線程安全的類。引入了全新的日期時間格式工具,線程安全而且使用方便。 前言 前面一篇文章寫了《SimpleDateFormat 如何安全的使用?》, 里面介紹了 SimpleDateFormat 如何處理日期/時間,以及如何保證線程安全,及其介紹了在 Java 8 中的處...
閱讀 2116·2021-11-24 10:28
閱讀 1138·2021-10-12 10:12
閱讀 3345·2021-09-22 15:21
閱讀 687·2021-08-30 09:44
閱讀 1903·2021-07-23 11:20
閱讀 1152·2019-08-30 15:56
閱讀 1763·2019-08-30 15:44
閱讀 1487·2019-08-30 13:55