/**
* 时间工具类
*
* @author :
* @createTime : 2015年3月16日 上午10:45:48
* @version : 1.0
* @description :
*
*/
public class DateUtils extends org.apache.commons.lang.time.DateUtils {
/**
* 将日值字符串转换成Date类型
*
* @param str
* 参数字符串
* @param format
* 格式
* @return Date
*/
public static Date parseDateString(String str, String format) {
if (str == null || str.equals("")) {
return null;
}
Date dt = null;
try {
DateFormat df = new SimpleDateFormat(format);
dt = df.parse(str);
} catch (Exception pe) {
}
return dt;
}
/**
* 调整时间 将指定日期调整 时间
*
* @param date
* 参数日期
* @param field
* 自定字段域
* @param amount
* 调整数量
* @param format
* 字符串格式
* @return String
*/
public static Date getAdjustDate(Date date, int field, int amount) {
if (date == null) {
return null;
}
Calendar can = Calendar.getInstance();
can.setTime(date);
can.add(field, amount);
Date newDate = can.getTime();
return newDate;
}
/**
* 取2个时间相差的天数
*
* @param date1
* @param date2
* @param isAbs
* true:取绝对值 false:差值可能是负数
* @return
* @throws Exception
*/
public static long getBetweenDiffDay(Date date1, Date date2, boolean isAbs) throws Exception {
long date1Value = date1.getTime();
long date2Value = date2.getTime();
long diff = (date1Value - date2Value) / (24 * 3600 * 1000);
if (isAbs) {
return Math.abs(diff);
} else {
return diff;
}
}
/**
* 取2个时间相差的小时数
*
* @param date1
* @param date2
* @param isAbs
* true:取绝对值 false:差值可能是负数
* @return
* @throws Exception
*/
public static long getBetweenDiffHour(Date date1, Date date2, boolean isAbs) throws Exception {
long date1Value = date1.getTime();
long date2Value = date2.getTime();
long diff = (date1Value - date2Value) / (3600 * 1000);
if (isAbs) {
return Math.abs(diff);
} else {
return diff;
}
}
/**
* 取2个时间相差的分钟数
*
* @param date1
* @param date2
* @param isAbs
* true:取绝对值 false:差值可能是负数
* @return
* @throws Exception
*/
public static long getBetweenDiffMinute(Date date1, Date date2, boolean isAbs) throws Exception {
long date1Value = date1.getTime();
long date2Value = date2.getTime();
long diff = (date1Value - date2Value) / (60 * 1000);
if (isAbs) {
return Math.abs(diff);
} else {
return diff;
}
}
/**
* 获取两个时间相差剩余的天数小时分钟秒
* @param date1
* @param date2
* @return
*
* @author : weihui
* @createTime : 2015年5月8日 下午4:44:17
*/
public static Map<String,Integer> getBetweenDiffRemanentInfo(Date date1, Date date2){
long time = date1.getTime() - date2.getTime();
int day = (int) (time / (24 * 60 * 60 * 1000l));
int hour = (int) ((time - day * 24 * 60 * 60 * 1000l)/ (60 * 60 * 1000l));
int minute = (int) ((time - day * 24 * 60 * 60 * 1000l - hour * 60 * 60 * 1000l) / (60 * 1000l));
int second = (int) ((time - day * 24 * 60 * 60 * 1000l - hour * 60 * 60 * 1000l - minute * 60 * 1000l) / 1000l);
Map<String,Integer> map = new HashMap<String, Integer>();
map.put("day", day);
map.put("hour", hour);
map.put("minute", minute);
map.put("second", second);
return map;
}
public static void main(String[] args) throws Exception {
Date date1 = new Date();
Date date2 = DateFormatUtils.format("2015-05-08 16:35", "yyyy-MM-dd HH:mm");
System.out.println(getBetweenDiffDay(date1, date2, true));
System.out.println(getBetweenDiffHour(date1, date2, true));
System.out.println(getBetweenDiffMinute(date1, date2, true));
}
/**
* 得到指定日期所在月的最后一天,如果给定时间是月末,返回值应该是下个月末
*
* @param date
* @return Date
*/
public static Date getMonthEnd(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
// 说明给定时间是月末,返回值应该是下个月末
if (can.get(Calendar.DAY_OF_MONTH) == can.getActualMaximum(Calendar.DAY_OF_MONTH)) {
can.add(Calendar.MONTH, 1);
}
can.set(Calendar.DAY_OF_MONTH, can.getActualMaximum(Calendar.DAY_OF_MONTH));
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
return can.getTime();
}
/**
* 得到指定日期所在月的第一天的0点0分0秒
*
* @param date
* @return Date
*/
public static Date getCurrentMonthBegin(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
// 说明给定时间是月末,返回值应该是下个月末
can.set(Calendar.DAY_OF_MONTH, can.getActualMinimum(Calendar.DAY_OF_MONTH));
can.set(Calendar.HOUR_OF_DAY, 00);
can.set(Calendar.MINUTE, 00);
can.set(Calendar.SECOND, 00);
return can.getTime();
}
/**
* 得到指定日期所在月的第最后天的23点59分59秒
*
* @param date
* @return Date
*/
public static Date getCurrentMonthEnd(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
// 说明给定时间是月末,返回值应该是下个月末
can.set(Calendar.DAY_OF_MONTH, can.getActualMaximum(Calendar.DAY_OF_MONTH));
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
return can.getTime();
}
/**
* 得到今天所在月的最后一天, 如果给定时间是月末,返回值应该是下个月末
*
* @return Date
*/
public static Date getMonthEnd() {
Date date = new Date();
Calendar can = Calendar.getInstance();
can.setTime(date);
// 说明给定时间是月末,返回值应该是下个月末
if (can.get(Calendar.DAY_OF_MONTH) == can.getActualMaximum(Calendar.DAY_OF_MONTH)) {
can.add(Calendar.MONTH, 1);
}
can.set(Calendar.DAY_OF_MONTH, can.getActualMaximum(Calendar.DAY_OF_MONTH));
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
return can.getTime();
}
/**
* 得到指定日期所在周的的最后一天,如果传入的时间已经是周末,返回值应该是下个周末
*
* @param date
* @return Date
*/
public static Date getWeekEnd(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
// 说明传入的时间已经是周末,返回值应该是下个周末
if (1 == can.get(Calendar.DAY_OF_WEEK)) {
can.add(Calendar.WEEK_OF_MONTH, 1);
}
can.set(Calendar.DAY_OF_WEEK, can.getActualMaximum(Calendar.DAY_OF_WEEK));
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
can.add(Calendar.DAY_OF_MONTH, 1);
return can.getTime();
}
/**
* 得到指定日期第二天的结束时间
*
* @param date
* @return Date
*/
public static Date getTomorrowEnd(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
can.add(Calendar.DAY_OF_MONTH, 1);
return can.getTime();
}
/**
* 获得指定天的昨天的最后时间
*
* @param date
* @return
*/
public static Date getYesterdayEnd(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
can.add(Calendar.DAY_OF_MONTH, -1);
return can.getTime();
}
public static Date getYesterdayStart(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
can.set(Calendar.HOUR_OF_DAY, 00);
can.set(Calendar.MINUTE, 00);
can.set(Calendar.SECOND, 00);
can.add(Calendar.DAY_OF_MONTH, -1);
return can.getTime();
}
/**
* 设置特定时间的小时偏移量和天数偏移量。
*
* @param date
* 指定的天
* @param hourOffset
* 小时偏移量 正数为增加小时,负数为减去小时
* @param dateOffset
* 天数偏移量 正数为增加天 ,负数为减去天
* @param startOrEnd
* 0为开始时间忽略小时偏移量,例:2008-01-10 00:00:00 1为结束时间忽略小时偏移量,例:2008-01-10
* 23:59:59 2为指定时间的偏移量时间 例:偏移量为-1 指定时间为2008-01-10 00:00:00
* 返回时间为:2008-01-09 23:00:00
* @return
*/
public static Date getAppointDateByOffset(Date date, int hourOffset, int dateOffset, int startOrEnd) {
Calendar can = Calendar.getInstance();
can.setTime(date);
int hourOfDay = hourOffset;
int minute = 0;
int second = 0;
if (startOrEnd == 1) {
hourOfDay = 23;
minute = 59;
second = 59;
} else if (startOrEnd == 2) {
hourOfDay = hourOffset;
minute = 0;
second = 0;
}
can.set(Calendar.HOUR_OF_DAY, hourOfDay);
can.set(Calendar.MINUTE, minute);
can.set(Calendar.SECOND, second);
can.add(Calendar.DAY_OF_MONTH, dateOffset);
return can.getTime();
}
/**
* 得到现在时间所在周的的最后一天,如果传入的时间已经是周末,返回值应该是下个周末
*
* @return Date
*/
public static Date getWeekEnd() {
Date date = new Date();
Calendar can = Calendar.getInstance();
can.setTime(date);
// 说明传入的时间已经是周末,返回值应该是下个周末
if (1 == can.get(Calendar.DAY_OF_WEEK)) {
can.add(Calendar.WEEK_OF_MONTH, 1);
}
can.set(Calendar.DAY_OF_WEEK, can.getActualMaximum(Calendar.DAY_OF_WEEK));
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
can.add(Calendar.DAY_OF_MONTH, 1);
return can.getTime();
}
/**
* 取得偏移时间
*
* @param nowDate
* date偏移时间;
* @param day
* 偏移天数
* @param status
* 为分钟量 0是返回时间为00:00:00 ;1是返回为23:59:59; 2返回原始
* @return
*/
public static Date getOffsetTime(Date nowDate, int day, int status) {
Calendar curCalendar = Calendar.getInstance();
curCalendar.setTime(nowDate);
long t = curCalendar.getTimeInMillis() + day * 24 * 60 * 60 * 1000L;
curCalendar.setTimeInMillis(t);
if (status == 0) {
curCalendar.set(Calendar.HOUR_OF_DAY, 0);
curCalendar.set(Calendar.MINUTE, 0);
curCalendar.set(Calendar.SECOND, 0);
} else if (status == 1) {
curCalendar.set(Calendar.HOUR_OF_DAY, 23);
curCalendar.set(Calendar.MINUTE, 59);
curCalendar.set(Calendar.SECOND, 59);
}
return curCalendar.getTime();
}
/**
* 返回指定天的开始
*
* @param date
* @return
*/
public static Date getCurrentDayBegin(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
can.set(Calendar.HOUR_OF_DAY, 00);
can.set(Calendar.MINUTE, 00);
can.set(Calendar.SECOND, 00);
return can.getTime();
}
/**
* 返回指定天的结束
*
* @param date
* @return
*/
public static Date getCurrentDayEnd(Date date) {
Calendar can = Calendar.getInstance();
can.setTime(date);
can.set(Calendar.HOUR_OF_DAY, 23);
can.set(Calendar.MINUTE, 59);
can.set(Calendar.SECOND, 59);
return can.getTime();
}
/**
* 获取指定日期,指定偏移月份的日期
*
* @param date
* @param month
* @return
*/
public static Date getOffsetTimeByMonth(Date date, int month) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int sMonth = calendar.get(Calendar.MONTH);
calendar.set(Calendar.MONTH, sMonth - month);
return calendar.getTime();
}
/**
* 获取时间差,返回固定格式yyyy_M_d
*
* @param startTm
* @param endTm
* @return
*/
public static List<String> getDateFix(long startTm, long endTm) {
List<String> ret = new ArrayList<String>();
if (startTm > endTm)
return ret;
Calendar startCal = new GregorianCalendar(TimeZone.getTimeZone("GMT+8"));
startCal.setTimeInMillis(startTm);
// startCal.set(Calendar.DAY_OF_YEAR, 1);
Calendar endCal = new GregorianCalendar(TimeZone.getTimeZone("GMT+8"));
endCal.setTimeInMillis(endTm);
// endCal.set(Calendar.DAY_OF_YEAR, 2);
for (; startCal.before(endCal); startCal.add(Calendar.DAY_OF_YEAR, 1)) {
String s = startCal.get(Calendar.YEAR) + "_" + (startCal.get(Calendar.MONTH) + 1) + "_"
+ (startCal.get(Calendar.DATE));
ret.add(s);
}
return ret;
}
/**
* 将一个java.util.Date类型变量依指定格式转换为字符串
*
* @param d
* @param format
* @return
*/
public static String dateToString(Date d, String format) {
if (d == null)
return null;
else
return new SimpleDateFormat(format).format(d);
}
//将时间戳转换为int类型的日期格式 20160601
public static int timeTo_yyyyMMdd(long time){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
return Integer.parseInt(dateFormat.format(time));
}
//将时间转换成String类型
public static String dateToStringAccurateToDay(Date date){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
return dateFormat.format(date);
}
//将时间戳转换成String类型
public static String timeToStringAccurateToSecond(long time){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(time);
return dateFormat.format(date);
}
}