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 {
Map<Integer, Integer> m = new HashMap<Integer, Integer>();
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();
// }
}
}