import org.apache.commons.lang3.StringUtils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 日期工具类
*
* @author silence
* @version 2017/12/24
*/
public class DateUtil {
private static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
public static final SimpleDateFormat TIME_FORMAT = new SimpleDateFormat("HH:mm:ss");
public static final int DAYS_OF_ONE_WEEK = 7;
/**
* 查当前日期是一周中的第几天、星期几
* @return
*/
public static long getWhicthDay(Date today){
Calendar cal = Calendar.getInstance();
cal.setTime(today);
// 1=Sunday,2=Monday,,,7=Saturday。
return cal.get(Calendar.DAY_OF_WEEK);
}
/**
* 判断日期是否相等 年/月/日相等 就是相等了
*
* @param day1
* @param day2
* @return
*/
public static boolean isDateEqualToday(Date day1, Date day2) {
return day1.getYear() == day2.getYear()
&& day1.getMonth() == day2.getMonth()
&& day1.getDay() == day2.getDay();
}
/**
* 计算距离baseDate 若干天的 日期
* days=2 表示2天后
* days=-1 一天前
*
* @param baseDate 日期 null 表示当前日期
* @param days 日期
* @return
*/
public static Date daysBetweenWeeks(Date baseDate, int days) {
Calendar c = Calendar.getInstance();
if (baseDate != null)
c.setTime(baseDate);
c.add(Calendar.DAY_OF_MONTH, days);
return c.getTime();
}
public static java.sql.Date fromUtilDate(Date utilDate) {
java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
return sqlDate;
}
// public static Date lastMonday() {
// Date _7daysBefore = daysBetweenWeeks(null, -DAYS_OF_ONE_WEEK);
// return mondayOfThisWeek(_7daysBefore);
// }
//
// public static Date lastSunday() {
// Date _7daysBefore = daysBetweenWeeks(null, -DAYS_OF_ONE_WEEK);
// return sundayOfThisWeek(_7daysBefore);
// }
/**
* 获取某个日期对应的 日期 的周一
*
* @param theDate 某个日期 null的话,表示当前日期
* @return Date
*/
public static Date mondayOfThisWeek(Date theDate) {
Calendar c = Calendar.getInstance();
if (theDate != null) c.setTime(theDate);
c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); // 获取 周一
return c.getTime();
}
/**
* 获取某个日期对应的 日期 的周日
*
* @param theDate 某个日期 null的话,表示当前日期
* 获取当前日期的周7,注意 日历获取的周期是
* 周日,1,2,3,4,5,6 不是中国传统的
* 1,2,3,4,5,6,周日
* 所以要加7
* @return Date
*/
public static Date sundayOfThisWeek(Date theDate) {
Calendar c = Calendar.getInstance();
if (theDate != null) c.setTime(theDate);
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); // 获取 周日
c.add(Calendar.DAY_OF_MONTH, 7); // 获取 中国意义上的 周日
return c.getTime();
}
/**
* 获取某个日期对应的 日期 的周日
*
* @param theDate 某个日期 null的话,表示当前日期
* 获取当前日期的周7,注意 日历获取的周期是
* 周日,1,2,3,4,5,6 不是中国传统的
* 1,2,3,4,5,6,周日
* 所以要加7
* @return Date
*/
public static Date getSundayOfThisWeek(Date theDate) {
Calendar c = Calendar.getInstance();
if (theDate != null) c.setTime(theDate);
c.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY); // 获取 周日
c.add(Calendar.DAY_OF_MONTH, 7); // 获取 中国意义上的 周日
if(getWhicthDay(theDate)==1){
c.add(Calendar.DATE, c.getFirstDayOfWeek() - 8);
}
return c.getTime();
}
/**
* 字符串转换为日期类型
*
* @param dateString
* @return
*/
public static Date stringToDate(String dateString) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.parse(dateString);
} catch (ParseException e) {
System.out.println(e.getMessage());
}
return null;
}
public static String dateToString(Date date) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(date);
} catch (Exception e) {
System.out.println(e.getMessage());
}
return date.toString();
}
/**
* YYYY:MM:DD hh:mm:ss --->YYYY:MM:DD
*
* @param date
* @return
*/
public static Date timeToDate(Date date) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = sdf.format(date);
try {
return sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取某天当前周的周一
* @param date
* @return
*/
public static Date getThisWeekMonday(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// 获得当前日期是一个星期的第几天
int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
if (1 == dayWeek) {
cal.add(Calendar.DAY_OF_MONTH, -1);
}
// 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
cal.setFirstDayOfWeek(Calendar.MONDAY);
// 获得当前日期是一个星期的第几天
int day = cal.get(Calendar.DAY_OF_WEEK);
// 根据日历的规则,当前日期减去 星期几与一个星期第一天的差值 即可计算当前周期第一天
cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - day);
return cal.getTime();
}
/**
* 获取某天上周一的日期
*
* @param date
* @return
*/
public static Date geLastWeekMonday(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(getThisWeekMonday(date));
cal.add(Calendar.DATE, -7);
return cal.getTime();
}
/**
* 获取某天下周一的日期
*
* @param date
* @return
*/
public static Date getNextWeekMonday(Date date) {
Calendar cal = Calendar.getInstance();
cal.setTime(getThisWeekMonday(date));
cal.add(Calendar.DATE, 7);
return cal.getTime();
}
/**
* 获取某天的前后几天的日期
*
* @param date
* @param day :正数表示后几天,负数表示前几天
* @return
*/
public static Date addDay(Date date, int day) {
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE, day);
return cal.getTime();
}
/**
* 添加时间
*
* @param date
* @param time hh:mm:ss
* @return
*/
public static Date addTime(Date date, String time) {
if (StringUtils.isEmpty(time)) return date;
Calendar cd = Calendar.getInstance();
cd.setTime(date);
String[] times = time.split(":");//eg:["01","00","00"]
int[] timeUnit = {Calendar.HOUR, Calendar.MINUTE, Calendar.SECOND};
if (date != null) {
for (int i = 0; i < times.length; i++) {
cd.add(timeUnit[i], Integer.valueOf(times[i]));
}
}
return cd.getTime();
}
}