import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import com.huawei.bass.query.core.config.BIPropertiesBean;
public class DateUtils {
/**
* 一个日期早于一个日期区间
*/
public static final int BEFORE_START_DATE = -2;
/**
* 一个日期等于一个日期区间的开始日期
*/
public static final int EQUAL_START_DATE = -1;
/**
* 一个日期在一个日期区间之内
*/
public static final int BETWEEN_TOW_DATE = 0;
/**
* 一个日期等于一个日期区间的结束日期
*/
public static final int EQUAL_END_DATE = 1;
/**
* 一个日期晚于一个日期区间
*/
public static final int AFTER_END_DATE = 2;
/**
* 三个日期相等
*/
public static final int TREE_DATE_EQUAL = 3;
/**
* 普通日期格式
*/
public static final String NORMAL_DATE_PATTERN = "yyyy-MM-dd";
public static final String ZHCN_DATE_PATTERN = "yyyy年MM月dd日";
public static final String ZHCN_DATE_TIME_PATTERN = "yyyy年MM月dd日 HH:mm:ss";
/**值班日期(白班)每天的起始时间点,或(晚班)的结束时间点*/
public static String dutyStartData=BIPropertiesBean.getProperty("DUTY_START_DATA","9:00:00");
/**值班日期(白班)每天的结束时间点,或(晚班)的起始时间点*/
public static String dutyEndData=BIPropertiesBean.getProperty("DUTY_END_DATA","18:30:00");
private DateUtils() {
}
/**
*
* @Description:判断<firstDate>时间点是否在<secondDate>时间点之前
* 如果此 firstDate 的时间在参数<secondDate>表示的时间之前,则返回小于 0 的值
* @param firstDate
* @param secondDate
* @return
* @ReturnType boolean
* @author:
* @Created 2012 2012-9-20上午08:40:33
*/
public static boolean isBefore(Date firstDate, Date secondDate) {
return compare(firstDate, secondDate) < 0 ? true : false;
}
/**
*
* @Description:判断<firstDate>时间点是否在<secondDate>时间点之后
* 如果此 firstDate 的时间在参数<secondDate>表示的时间之后,则返回大于 0 的值
* @param firstDate
* @param secondDate
* @ReturnType boolean
* @author:
* @Created 2012 2012-9-20上午08:38:48
*/
public static boolean isAfter(Date firstDate, Date secondDate) {
return compare(firstDate, secondDate) > 0 ? true : false;
}
/**
*
* @Description:比较两个时间点是否相等
* @param firstDate
* @param secondDate
* @ReturnType boolean
* @author:
* @Created i2012 2012-9-20上午08:37:30
*/
public static boolean isEqual(Date firstDate, Date secondDate) {
return compare(firstDate, secondDate) == 0 ? true : false;
}
/**
*
* @Description:比较两个时间点
* 如果secondDate表示的时间等于此 firstDate 表示的时间,则返回 0 值;
* 如果此 firstDate 的时间在参数<secondDate>表示的时间之前,则返回小于 0 的值;
* 如果此 firstDate 的时间在参数<secondDate>表示的时间之后,则返回大于 0 的值
* @param firstDate
* @param secondDate
* @ReturnType int
* @author:
* @Created 2012 2012-9-20上午08:34:33
*/
public static int compare(Date firstDate, Date secondDate) {
Calendar firstCalendar = null;
/**使用给定的 Date 设置此 Calendar 的时间。**/
if (firstDate != null) {
firstCalendar = Calendar.getInstance();
firstCalendar.setTime(firstDate);
}
Calendar secondCalendar = null;
/**使用给定的 Date 设置此 Calendar 的时间。**/
if (firstDate != null) {
secondCalendar = Calendar.getInstance();
secondCalendar.setTime(secondDate);
}
try {
/**
* 比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量)。
* 如果参数表示的时间等于此 Calendar 表示的时间,则返回 0 值;
* 如果此 Calendar 的时间在参数表示的时间之前,则返回小于 0 的值;
* 如果此 Calendar 的时间在参数表示的时间之后,则返回大于 0 的值
* **/
return firstCalendar.compareTo(secondCalendar);
} catch (NullPointerException e) {
throw new IllegalArgumentException(e);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException(e);
}
}
/**
*
* @Description:
* @param startDate
* @param endDate
* @param inDate
* @return
* @ReturnType int
* @author:
* @Created 2012 2012-9-20上午08:42:06
*/
public static int betweenTowDate(Date startDate, Date endDate, Date inDate) {
/**
* 判断<endDate>时间点是否在<startDate>时间点之前
* 如果为真表示<endDate>时间点在<startDate>时间点之前则抛出异常
* 即结束时间在开始时间之前是不正常的
*/
if (isBefore(endDate, startDate)) {
throw new IllegalArgumentException(
"endDate can not before startDate!");
}
/**
* 比较两个时间点<inDate>和<startDate>
* 如果inDate表示的时间等于此 startDate 表示的时间,则返回 0 值;
* 如果此 inDate 的时间在参数<startDate>表示的时间之前,则返回小于 0 的值;
* 如果此 inDate 的时间在参数<startDate>表示的时间之后,则返回大于 0 的值
*/
int sflag = compare(inDate,startDate);
/**
* 比较两个时间点<inDate>和<endDate>
* 如果inDate表示的时间等于此 endDate 表示的时间,则返回 0 值;
* 如果此 inDate 的时间在参数<endDate>表示的时间之前,则返回小于 0 的值;
* 如果此 inDate 的时间在参数<endDate>表示的时间之后,则返回大于 0 的值
*/
int eflag = compare(inDate,endDate);
int flag = 0;
/**如果此 inDate 的时间在参数<startDate>表示的时间之前,则返回小于 0 的值**/
if (sflag < 0){
/**一个日期早于一个日期区间**/
flag = DateUtils.BEFORE_START_DATE;
}else if (sflag == 0) { /**如果inDate表示的时间等于此 startDate 表示的时间,则返回 0 值;**/
/**如果inDate表示的时间等于此 endDate 表示的时间,则返回 0 值;**/
if (eflag == 0) {
/**三个日期相等**/
flag = DateUtils.TREE_DATE_EQUAL;
}else {
/**一个日期等于一个日期区间的开始日期**/
flag = DateUtils.EQUAL_START_DATE;
}
}else if (sflag > 0 && eflag < 0) {/**满足-inDate 的时间在参数<startDate>表示的时间之后,和 inDate 的时间在参数<endDate>表示的时间之前**/
/**一个日期在一个日期区间之内**/
flag = DateUtils.BETWEEN_TOW_DATE;
} else if (eflag == 0) {/**如果inDate表示的时间等于此 endDate 表示的时间**/
/**一个日期等于一个日期区间的结束日期**/
flag = DateUtils.EQUAL_END_DATE;
} else if (eflag > 0) {/**满足inDate 的时间在参数<endDate>表示的时间之后**/
/**一个日期晚于一个日期区间**/
flag = DateUtils.AFTER_END_DATE;
}
return flag;
}
/**
*
* @Description:分别判断当前日期是与一个日期区间的六种情况比较
* (1) 一个日期早于一个日期区间
* (2)三个日期相等
* (3)一个日期等于一个日期区间的开始日期
* (4)一个日期在一个日期区间之内
* (5)一个日期等于一个日期区间的结束日期
* (6)一个日期晚于一个日期区间
* @param startDate
* @param endDate
* @return
* @ReturnType int
* @author:
* @Created 2012 2012-9-20上午09:00:31
*/
public static int betweenTowDate(Date startDate, Date endDate) {
return betweenTowDate(startDate, endDate, new Date());
}
/**
* 将Date型转换为String型
*
* @param dtDate
* Date 要转换的时间
* @param strPattern
* String 转换的格式
* @return String 转换后的时间 说明:格式可以为 yyyy-MM-dd HH:mm:ss等,可任意组合,如 yyyy年MM月dd日
* yyyy代表年 MM代表月 dd代表日 HH hh kk代表小时 mm代表分钟 ss代表秒钟 format
*/
public static String dateToString(Date dtDate, String strPattern) {
SimpleDateFormat lsdfDate = new SimpleDateFormat(strPattern);
return lsdfDate.format(dtDate);
}
/**
*
* @Description:将符合相应格式的字符串转化为日期 <格式自定义>
* @param dateStr 日期字符串
* @param pattern 日期格式
* @ReturnType Date 日期字串为空或者不符合日期格式时返回null
* @author:
* @Created 2012 2012-9-20上午09:06:00
*/
public static Date getDate(String dateStr, String pattern) {
return getDate(dateStr, pattern, null);
}
/**
* 将符合相应格式的字符串转化为日期 格式自定义
*
* @param dateStr
* 日期字符串
* @param pattern
* 日期格式
* @param defaultDate
* 默认日期
* @return 日期字串为空或者不符合日期格式时返回defaultDate
*/
public static Date getDate(String dateStr, String pattern, Date defaultDate) {
if (dateStr != null && pattern != null) {
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
}
}
return defaultDate;
}
/**
*
* @Description:将某种日期转换成指定格式的日期数据 <获取相应格式的Date>
* @param date 需要格式的日期参数
* @param pattern 日期格式
* @ReturnType Date
* @author:
* @Created 2012 2012-9-20上午09:08:24
*/
public static Date getFormatDate(Date date, String pattern) {
if (date == null) {
throw new IllegalArgumentException("date can not be null!");
}
if (pattern == null) {
pattern = NORMAL_DATE_PATTERN;
}
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
String dateStr = sdf.format(date);
try {
return sdf.parse(dateStr);
} catch (ParseException e) {
}
return date;
}
/**
*
* @Description:将符合相应格式的字符串转化为日期 格式 yyyy-MM-dd
* @param dateStr
* @return 日期字串为空或者不符合日期格式时返回null
* @ReturnType Date
* @author:
* @Created 2012 2012-9-20上午09:04:28
*/
public static Date getDate(String dateStr) {
return getDate(dateStr, DateUtils.NORMAL_DATE_PATTERN);
}
/**
*
* @Description:将当前日期转换成字符串 格式 yyyy-MM-dd
* @ReturnType String
* @author:
* @Created 2012 2012-9-19下午05:54:42
*/
public static String datetoStr() {
SimpleDateFormat sdf = new SimpleDateFormat(NORMAL_DATE_PATTERN);
String curDate = sdf.format(new Date());
return curDate;
}
/**
*
* @Description: 获取当天日期,日期格式为YYYYMMDD
* @ReturnType String
* @author:
* @Created 2012 2012-9-20上午09:17:19
*/
public static String getIntraday() {
Calendar date = Calendar.getInstance();// 获得当前日期
int year = date.get(Calendar.YEAR);
int month = date.get(Calendar.MONTH) + 1;
int day = date.get(Calendar.DAY_OF_MONTH);
String updateFileDate = new String(new Integer(year).toString()
+ new Integer(month).toString() + new Integer(day).toString());
return updateFileDate;
}
/**
*
* @Description:获取当天日期,日期格式为YYYY-MM-DD HH:mm:ss
* @return
* @ReturnType Date
* @author:
* @Created 2012 2012-9-20上午09:58:36
*/
public static Date getCurrentlyDate(){
Date currentDate=new Date();
return getFormatDate(currentDate,"yyyy-MM-dd HH:mm:ss");
}
/**
*
* @Description:取得当前日期的下一日
* @ReturnType String
* @author:
* @Created 2012 2012-9-20上午09:12:06
*/
public static String getTomorrowDate(){
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date myDate=new Date();
long myTime=(myDate.getTime()/1000)-60*60*24*365;
myDate.setTime(myTime*1000);
String mDate=formatter.format(myDate);
return mDate;
}
/**
*
* @Description:取当前日期后的第二日
* @return
* @ReturnType String
* @author:
* @Created 2012 2012-9-20上午10:37:47
*/
public static String getNextTomorrowDate(){
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date myDate=new Date();
long myTime=(myDate.getTime()/1000)-60*60*24*365;
myDate.setTime(myTime*1000);
String mDate=formatter.format(myDate);
//以下为再向后推一天
myTime=(myDate.getTime()/1000)+60*60*24;
myDate.setTime(myTime*1000);
mDate=formatter.format(myDate);
return mDate;
}
/**
*
* @Description:获取值班白班起始时间点
* @return
* @ReturnType Date
* @author:
* @Created 2012 2012-9-20上午09:29:51
*/
public static Date getdaytimeStartTime(){
/**白天值班起始日期 -当天早上<9:00:00>*/
String daytimeStartTime=datetoStr()+" "+dutyStartData;
return getDate(daytimeStartTime,"yyyy-MM-dd HH:mm:ss");
}
/**
*
* @Description:获取值班白班结束时间点
* @return
* @ReturnType Date
* @author:
* @Created 2012 2012-9-20上午09:31:02
*/
public static Date getdaytimeEndTime(){
/**白天值班结束日期 -当天晚上<18:30:00>*/
String daytimeEndTime=datetoStr()+" "+dutyEndData;
return getDate(daytimeEndTime,"yyyy-MM-dd HH:mm:ss");
}
/**
*
* @Description:获取值班夜晚值班起始时间点
* @return
* @ReturnType Date
* @author:
* @Created 2012 2012-9-20上午09:42:44
*/
public static Date getnightStartTime(){
/**夜晚值班起始日期-当天晚上<18:30:00>**/
String nightStartTime=datetoStr()+" "+dutyEndData;
return getDate(nightStartTime,"yyyy-MM-dd HH:mm:ss");
}
/**
*
* @Description:获取夜晚值班结束时间点
* @return
* @ReturnType Date
* @author:
* @Created 2012 2012-9-20上午09:46:56
*/
public static Date getnightEndTime(){
/**夜晚值班结束日期-第二天早上<9:00:00>**/
String nightEndTime=getTomorrowDate()+" "+dutyStartData;
return getDate(nightEndTime,"yyyy-MM-dd HH:mm:ss");
}
}