import
java.text.ParsePosition;
import
java.text.SimpleDateFormat;
import
java.util.Calendar;
import
java.util.Date;
import
java.util.GregorianCalendar;
import
java.util.regex.Pattern;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
public
class
DateUtil {
protected
static
Log logger
=
LogFactory.getLog(DateUtil.
class
);
//
格式:年-月-日 小时:分钟:秒
public
static
final
String FORMAT_ONE
=
"
yyyy-MM-dd HH:mm:ss
"
;
//
格式:年-月-日 小时:分钟
public
static
final
String FORMAT_TWO
=
"
yyyy-MM-dd HH:mm
"
;
//
格式:年月日 小时分钟秒
public
static
final
String FORMAT_THREE
=
"
yyyyMMdd-HHmmss
"
;
//
格式:年-月-日
public
static
final
String LONG_DATE_FORMAT
=
"
yyyy-MM-dd
"
;
//
格式:月-日
public
static
final
String SHORT_DATE_FORMAT
=
"
MM-dd
"
;
//
格式:小时:分钟:秒
public
static
final
String LONG_TIME_FORMAT
=
"
HH:mm:ss
"
;
//
格式:年-月
public
static
final
String MONTG_DATE_FORMAT
=
"
yyyy-MM
"
;
//
年的加减
public
static
final
int
SUB_YEAR
=
Calendar.YEAR;
//
月加减
public
static
final
int
SUB_MONTH
=
Calendar.MONTH;
//
天的加减
public
static
final
int
SUB_DAY
=
Calendar.DATE;
//
小时的加减
public
static
final
int
SUB_HOUR
=
Calendar.HOUR;
//
分钟的加减
public
static
final
int
SUB_MINUTE
=
Calendar.MINUTE;
//
秒的加减
public
static
final
int
SUB_SECOND
=
Calendar.SECOND;
static
final
String dayNames[]
=
{
"
星期日
"
,
"
星期一
"
,
"
星期二
"
,
"
星期三
"
,
"
星期四
"
,
"
星期五
"
,
"
星期六
"
};
@SuppressWarnings(
"
unused
"
)
private
static
final
SimpleDateFormat timeFormat
=
new
SimpleDateFormat(
"
yyyy-MM-dd HH:mm:ss
"
);
public
DateUtil() {
}
/**
* 把符合日期格式的字符串转换为日期类型
*/
public
static
java.util.Date stringtoDate(String dateStr, String format) {
Date d
=
null
;
SimpleDateFormat formater
=
new
SimpleDateFormat(format);
try
{
formater.setLenient(
false
);
d
=
formater.parse(dateStr);
}
catch
(Exception e) {
//
log.error(e);
d
=
null
;
}
return
d;
}
/**
* 把符合日期格式的字符串转换为日期类型
*/
public
static
java.util.Date stringtoDate(String dateStr, String format,
ParsePosition pos) {
Date d
=
null
;
SimpleDateFormat formater
=
new
SimpleDateFormat(format);
try
{
formater.setLenient(
false
);
d
=
formater.parse(dateStr, pos);
}
catch
(Exception e) {
d
=
null
;
}
return
d;
}
/**
* 把日期转换为字符串
*/
public
static
String dateToString(java.util.Date date, String format) {
String result
=
""
;
SimpleDateFormat formater
=
new
SimpleDateFormat(format);
try
{
result
=
formater.format(date);
}
catch
(Exception e) {
//
log.error(e);
}
return
result;
}
/**
* 获取当前时间的指定格式
*/
public
static
String getCurrDate(String format) {
return
dateToString(
new
Date(), format);
}
public
static
String dateSub(
int
dateKind, String dateStr,
int
amount) {
Date date
=
stringtoDate(dateStr, FORMAT_ONE);
Calendar calendar
=
Calendar.getInstance();
calendar.setTime(date);
calendar.add(dateKind, amount);
return
dateToString(calendar.getTime(), FORMAT_ONE);
}
/**
* 两个日期相减
*
@return
相减得到的秒数
*/
public
static
long
timeSub(String firstTime, String secTime) {
long
first
=
stringtoDate(firstTime, FORMAT_ONE).getTime();
long
second
=
stringtoDate(secTime, FORMAT_ONE).getTime();
return
(second
-
first)
/
1000
;
}
/**
* 获得某月的天数
*/
public
static
int
getDaysOfMonth(String year, String month) {
int
days
=
0
;
if
(month.equals(
"
1
"
)
||
month.equals(
"
3
"
)
||
month.equals(
"
5
"
)
||
month.equals(
"
7
"
)
||
month.equals(
"
8
"
)
||
month.equals(
"
10
"
)
||
month.equals(
"
12
"
)) {
days
=
31
;
}
else
if
(month.equals(
"
4
"
)
||
month.equals(
"
6
"
)
||
month.equals(
"
9
"
)
||
month.equals(
"
11
"
)) {
days
=
30
;
}
else
{
if
((Integer.parseInt(year)
%
4
==
0
&&
Integer.parseInt(year)
%
100
!=
0
)
||
Integer.parseInt(year)
%
400
==
0
) {
days
=
29
;
}
else
{
days
=
28
;
}
}
return
days;
}
/**
* 获取某年某月的天数
*/
public
static
int
getDaysOfMonth(
int
year,
int
month) {
Calendar calendar
=
Calendar.getInstance();
calendar.set(year, month
-
1
,
1
);
return
calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 获得当前日期
*/
public
static
int
getToday() {
Calendar calendar
=
Calendar.getInstance();
return
calendar.get(Calendar.DATE);
}
/**
* 获得当前月份
*/
public
static
int
getToMonth() {
Calendar calendar
=
Calendar.getInstance();
return
calendar.get(Calendar.MONTH)
+
1
;
}
/**
* 获得当前年份
*/
public
static
int
getToYear() {
Calendar calendar
=
Calendar.getInstance();
return
calendar.get(Calendar.YEAR);
}
/**
* 返回日期的天
*/
public
static
int
getDay(Date date) {
Calendar calendar
=
Calendar.getInstance();
calendar.setTime(date);
return
calendar.get(Calendar.DATE);
}
/**
* 返回日期的年
*/
public
static
int
getYear(Date date) {
Calendar calendar
=
Calendar.getInstance();
calendar.setTime(date);
return
calendar.get(Calendar.YEAR);
}
/**
* 返回日期的月份,1-12
*/
public
static
int
getMonth(Date date) {
Calendar calendar
=
Calendar.getInstance();
calendar.setTime(date);
return
calendar.get(Calendar.MONTH)
+
1
;
}
/**
* 计算两个日期相差的天数,如果date2 > date1 返回正数,否则返回负数
*/
public
static
long
dayDiff(Date date1, Date date2) {
return
(date2.getTime()
-
date1.getTime())
/
86400000
;
}
/**
* 比较两个日期的年差
*/
public
static
int
yearDiff(String before, String after) {
Date beforeDay
=
stringtoDate(before, LONG_DATE_FORMAT);
Date afterDay
=
stringtoDate(after, LONG_DATE_FORMAT);
return
getYear(afterDay)
-
getYear(beforeDay);
}
/**
* 比较指定日期与当前日期的差
*/
public
static
int
yearDiffCurr(String after) {
Date beforeDay
=
new
Date();
Date afterDay
=
stringtoDate(after, LONG_DATE_FORMAT);
return
getYear(beforeDay)
-
getYear(afterDay);
}
/**
* 比较指定日期与当前日期的差
*/
public
static
long
dayDiffCurr(String before) {
Date currDate
=
DateUtil.stringtoDate(currDay(), LONG_DATE_FORMAT);
Date beforeDate
=
stringtoDate(before, LONG_DATE_FORMAT);
return
(currDate.getTime()
-
beforeDate.getTime())
/
86400000
;
}
/**
* 获取每月的第一周
*/
public
static
int
getFirstWeekdayOfMonth(
int
year,
int
month) {
Calendar c
=
Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.SATURDAY);
//
星期天为第一天
c.set(year, month
-
1
,
1
);
return
c.get(Calendar.DAY_OF_WEEK);
}
/**
* 获取每月的最后一周
*/
public
static
int
getLastWeekdayOfMonth(
int
year,
int
month) {
Calendar c
=
Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.SATURDAY);
//
星期天为第一天
c.set(year, month
-
1
, getDaysOfMonth(year, month));
return
c.get(Calendar.DAY_OF_WEEK);
}
/**
* 获得当前日期字符串,格式"yyyy_MM_dd_HH_mm_ss"
*
*
@return
*/
public
static
String getCurrent() {
Calendar cal
=
Calendar.getInstance();
cal.setTime(
new
Date());
int
year
=
cal.get(Calendar.YEAR);
int
month
=
cal.get(Calendar.MONTH)
+
1
;
int
day
=
cal.get(Calendar.DAY_OF_MONTH);
int
hour
=
cal.get(Calendar.HOUR_OF_DAY);
int
minute
=
cal.get(Calendar.MINUTE);
int
second
=
cal.get(Calendar.SECOND);
StringBuffer sb
=
new
StringBuffer();
sb.append(year).append(
"
_
"
).append(StringUtil.addzero(month,
2
))
.append(
"
_
"
).append(StringUtil.addzero(day,
2
)).append(
"
_
"
)
.append(StringUtil.addzero(hour,
2
)).append(
"
_
"
).append(
StringUtil.addzero(minute,
2
)).append(
"
_
"
).append(
StringUtil.addzero(second,
2
));
return
sb.toString();
}
/**
* 获得当前日期字符串,格式"yyyy-MM-dd HH:mm:ss"
*
*
@return
*/
public
static
String getNow() {
Calendar today
=
Calendar.getInstance();
return
dateToString(today.getTime(), FORMAT_ONE);
}
/**
* 判断日期是否有效,包括闰年的情况
*
*
@param
date
* YYYY-mm-dd
*
@return
*/
public
static
boolean
isDate(String date) {
StringBuffer reg
=
new
StringBuffer(
"
^((\\d{2}(([02468][048])|([13579][26]))-?((((0?
"
);
reg.append(
"
[13578])|(1[02]))-?((0?[1-9])|([1-2][0-9])|(3[01])))
"
);
reg.append(
"
|(((0?[469])|(11))-?((0?[1-9])|([1-2][0-9])|(30)))|
"
);
reg.append(
"
(0?2-?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][12
"
);
reg.append(
"
35679])|([13579][01345789]))-?((((0?[13578])|(1[02]))
"
);
reg.append(
"
-?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))
"
);
reg.append(
"
-?((0?[1-9])|([1-2][0-9])|(30)))|(0?2-?((0?[
"
);
reg.append(
"
1-9])|(1[0-9])|(2[0-8]))))))
"
);
Pattern p
=
Pattern.compile(reg.toString());
return
p.matcher(date).matches();
}