public class DateUtil {
public static SimpleDateFormat YYYY = new SimpleDateFormat("yyyy");
public static String YYYY_MM_DD_STR = "yyyy-MM-dd";
public static SimpleDateFormat YYYY_MM_DD = new SimpleDateFormat(YYYY_MM_DD_STR);
public static SimpleDateFormat YYYY_MM_DD_HH_mm = new SimpleDateFormat("yyyy-MM-dd HH:mm");
public static String YYYY_MM_DD_HH_mm_ss_STR = "yyyy-MM-dd HH:mm:ss";
public static SimpleDateFormat YYYY_MM_DD_HH_mm_ss = new SimpleDateFormat(YYYY_MM_DD_HH_mm_ss_STR);
public static SimpleDateFormat YYYTMMDD = new SimpleDateFormat("yyyyMMdd");
public static SimpleDateFormat YYYTMM = new SimpleDateFormat("yyyy-MM");
public static SimpleDateFormat YYYYMM = new SimpleDateFormat("yyyyMM");
public static SimpleDateFormat HH_mm_ss = new SimpleDateFormat("HH:mm:ss");
public static SimpleDateFormat YYYY_MM = new SimpleDateFormat("yyyy-MM");
public static SimpleDateFormat HH_mm = new SimpleDateFormat("HH:mm");
public static SimpleDateFormat HH = new SimpleDateFormat("HH");
public static SimpleDateFormat mm = new SimpleDateFormat("mm");
public static SimpleDateFormat MMXDD = new SimpleDateFormat("MM/DD");
public static SimpleDateFormat YYMMDD = new SimpleDateFormat("yyMMdd");
/**
* 根据传入的日期字符串获取指定类型的日期对象
* @param date 传入的日期
* @return
*/
public static Date getDateByString(String date){
if (StringUtils.isBlank(date)){
return null;
}
try{
return YYYY_MM_DD_HH_mm_ss.parse(date);
}catch(Exception e){
e.printStackTrace();
}
return null;
}
/**
* 根据月份得出该月的天数
* @param date
* @return
*/
public static int getDayNumsOfMonth(String date){
Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTime(dat);
int maxDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
return maxDay;
}
/**
* 获取指定年月的最后一天的日期字符串
* @param yearMonth 2020-01
* @return 2020-01-31
*/
public static String getLastDayOfMonth(String yearMonth) {
// 格式化日期
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
int year = Integer.parseInt(yearMonth.split("-")[0]); //年
int month = Integer.parseInt(yearMonth.split("-")[1]); //月
Calendar cal = Calendar.getInstance();
// 设置年份
cal.set(Calendar.YEAR, year);
// 设置月份
cal.set(Calendar.MONTH, month); //设置当前月的下一个月
// 获取某月最大天数
int lastDay = cal.getMinimum(Calendar.DATE); //获取月份中的最小值,即第一天
// 设置日历中月份的最大天数
cal.set(Calendar.DAY_OF_MONTH, lastDay - 1); //下月的第一天减去1就是当月的最后一天
return sdf.format(cal.getTime());
}
/**
* 获取去年同月
* @param date
* @return
*/
public static String getLastYearMonth(String date){
Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTime(dat);
int year = cal.get(Calendar.YEAR)-1;
int month = cal.get(Calendar.MONTH)+1;
return year+"-"+(month<10?"0"+month:month);
}
/**
* 获取去年同期
* @param date
* @return
*/
public static String getLastYearDate(String date){
Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTime(dat);
int year = cal.get(Calendar.YEAR)-1;
int month = cal.get(Calendar.MONTH)+1;
int days = cal.get(Calendar.DATE);
return year+"-"+(month<10?"0"+month:month)+"-"+(days<10?"0"+days:days);
}
/**
* 获取上月
* @param date
* @return
*/
public static String getLastMonth(String date){
Date dat = DateFormat.getDateByString(date, "yyyy-MM-dd");
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTime(dat);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
if(month == 0) {
year = year -1;
month = 12;
}
return year+"-"+(month<10?"0"+month:month);
}
/**
* 传入时间加减时间的算法
* @param date
* @param param 1:年;2:月;3:日;4:小时;:5:分钟;6:秒
* @param numbers 整数:加上 负数:减去
* @return
*/
public static Date getDateByAddOrMinus(Date date,int param,int numbers){
Calendar cal = Calendar.getInstance();
cal.clear();
cal.setTime(date);
switch(param){
case 1 : cal.add(Calendar.YEAR,numbers); break;//日期减去/加上**年
case 2 : cal.add(Calendar.MONTH,numbers); break;//日期减去/加上**月
case 3 : cal.add(Calendar.DATE,numbers); break;//日期减去/加上**日
case 4 : cal.add(Calendar.HOUR,numbers); break;//日期减去/加上**小时
case 5 : cal.add(Calendar.MINUTE,numbers); break;//日期减去/加上**分钟
case 6 : cal.add(Calendar.SECOND,numbers); break;//日期减去/加上**秒
default : break;
}
return cal.getTime();
}
/**
* 月初xxxx-yy-zz (eg: 2007-12-31)
*
* @return String
* @author pure
**/
public static String getMonthStart(String today) {
Calendar localTime = Calendar.getInstance();
try {
localTime.setTime(YYYTMM.parse(today));
} catch (ParseException e) {
e.printStackTrace();
}
String strY = null;
int x = localTime.get(Calendar.YEAR);
int y = localTime.get(Calendar.MONTH) + 1;
strY = y >= 10 ? String.valueOf(y) : ("0" + y);
return x + "-" + strY + "-01";
}
/**
* 月末xxxx-yy-zz (eg: 2007-12-31)
*
* @return String
* @author pure
**/
public static String getMonthEnd(String today) {
Calendar localTime = Calendar.getInstance();
try {
localTime.setTime(YYYTMM.parse(today));
} catch (ParseException e) {
e.printStackTrace();
}
String strY = null;
String strZ = null;
boolean leap = false;
int year = localTime.get(Calendar.YEAR);
int month = localTime.get(Calendar.MONTH) + 1;
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
|| month == 10 || month == 12) {
strZ = "31";
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
strZ = "30";
}
if (month == 2) {
leap = leapYear(year);
if (leap) {
strZ = "29";
} else {
strZ = "28";
}
}
strY = month >= 10 ? String.valueOf(month) : ("0" + month);
return year + "-" + strY + "-" + strZ;
}
/**
* @param today yyyy-mm-dd
* @return 月份最大天数
*/
public static String getMonthEndDay(String today) {
Calendar localTime = Calendar.getInstance();
try {
localTime.setTime(YYYTMM.parse(today));
} catch (ParseException e) {
e.printStackTrace();
}
String strZ = null;
boolean leap = false;
int year = localTime.get(Calendar.YEAR);
int month = localTime.get(Calendar.MONTH) + 1;
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8
|| month == 10 || month == 12) {
strZ = "31";
}
if (month == 4 || month == 6 || month == 9 || month == 11) {
strZ = "30";
}
if (month == 2) {
leap = leapYear(year);
if (leap) {
strZ = "29";
} else {
strZ = "28";
}
}
return strZ;
}
/**
* 是否是闰年
*
* @param year
* @return ???true ??false
* @author pure
*/
private static boolean leapYear(int year) {
boolean leap;
if (year % 4 == 0) {
if (year % 100 == 0) {
if (year % 400 == 0)
leap = true;
else
leap = false;
} else
leap = true;
} else
leap = false;
return leap;
}
/**
* 获取当前日期是星期几
*
* @param date
* @return 当前日期是星期几 星期日 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6
*/
public static int getWeekOfDate(String date) {
Calendar localTime = Calendar.getInstance();
try {
localTime.setTime(YYYTMM.parse(date));
} catch (ParseException e) {
e.printStackTrace();
}
int[] weekDays = { 0, 1, 2, 3, 4, 5, 6 };
int w = localTime.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
/**
* 获取当前日期是星期几
*
* @param date
* @return 当前日期是星期几 星期日 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6
*/
public static String getWeekOfDateToString(String date) {
Calendar localTime = Calendar.getInstance();
try {
localTime.setTime(YYYY_MM_DD.parse(date));
} catch (ParseException e) {
return "----";
}
int[] weekDays = { 0, 1, 2, 3, 4, 5, 6 };
int w = localTime.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
switch (weekDays[w]) {
case 0:
return "日";
case 1:
return "一";
case 2:
return "二";
case 3:
return "三";
case 4:
return "四";
case 5:
return "五";
case 6:
return "六";
default:
return "----";
}
}
/**
* //当前月的最后一天是几号
*
* @return
*/
public static int getLastday(String date) {
Calendar c = Calendar.getInstance();
try {
c.setTime(YYYTMM.parse(date));
} catch (ParseException e) {
}
int lastday = c.getActualMaximum(Calendar.DAY_OF_MONTH);
return lastday;
}
/**
* 获得日期字符串数组
* @param calendarType 日期跨度的类型,
* */
public static Date[] getDateArrays(Date start,Date end ,int calendarType){
ArrayList<Date> ret = new ArrayList<Date>();
Calendar calendar = Calendar.getInstance();
calendar.setTime(start);
calendar.add(calendarType, 1);
Date tmpDate = calendar.getTime();
long endTime = end.getTime();
while(tmpDate.before(end)||tmpDate.getTime() < endTime){
ret.add(calendar.getTime());
calendar.add(calendarType, 1);
tmpDate = calendar.getTime();
}
Date[] dates = new Date[ret.size()];
return ret.toArray(dates);
}
/**
* 描述:获取当前日期及时间
* @return
*/
public static String getNowDateTime(){
return YYYY_MM_DD_HH_mm_ss.format(new Date());
}
/**
* 将日期转换成指定格式的字符串
* @param date
* @param dateFormatPattern
* @return
*/
public static String parseDate2StrNormal(Date date,String dateFormatPattern){
SimpleDateFormat dateFormat = new SimpleDateFormat(dateFormatPattern);
return dateFormat.format(date);
}
/**
* 将日期转换成指定格式的字符串
* @param date
* @param dateFormatPattern
* @return
*/
public static String parseDate2Str(Date date,SimpleDateFormat dateFormatPattern){
return dateFormatPattern.format(date);
}
/**
* 将指定格式的字符串转换成日期
* @param date
* @param dateFormatPattern
* @return
*/
public static Date parseStr2Date(String date,SimpleDateFormat dateFormatPattern){
try {
return dateFormatPattern.parse(date);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取执行日期的前几天或后几天
* @param date
* @param i
* @return
*/
public static Date getTagetDay(Date date,int i) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH,i);
date = calendar.getTime();
return date;
}
/**
* 根据日期判断该日期是否在参数所选的周次中
* @param dworkdate 指定的日期,格式2015-01-01
* @param param 周次参数字符串,格式1,2,3 其中星期日 0 星期一 1 星期二 2 星期三 3 星期四 4 星期五 5 星期六 6
* @return
*/
public static int judgeInWeek(String dworkdate,String param) {
Calendar localTime = Calendar.getInstance();
try {
localTime.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(dworkdate));
} catch (ParseException e) {
return -1;
}
List<String> weekDays = Arrays.asList(param.split(","));
int w = localTime.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0) w = 0;
if(weekDays.contains(""+w)){
//如果执行日期在参数范围内,返回1,否则返回0
return 1;
}else{
return 0;
}
}
/**
* 根据开始时间和结束时间返回时间段内的时间集合
* @param beginDate
* @param endDate
* @return List
* @throws ParseException
*/
public static List<String> getDatesBetweenTwoDate(String startdate, String enddate) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date beginDate = sdf.parse(startdate);
Date endDate = sdf.parse(enddate);
List<String> lDate = new ArrayList<String>();
lDate.add(startdate);// 把开始时间加入集合
Calendar cal = Calendar.getInstance();
// 使用给定的 Date 设置此 Calendar 的时间
cal.setTime(beginDate);
boolean bContinue = true;
while (bContinue) {
// 根据日历的规则,为给定的日历字段添加或减去指定的时间量
cal.add(Calendar.DAY_OF_MONTH, 1);
// 测试此日期是否在指定日期之后
if (endDate.after(cal.getTime())) {
lDate.add(sdf.format(cal.getTime()));
} else {
break;
}
}
if (!startdate.equals(enddate)) {
lDate.add(enddate);// 把结束时间加入集合
}
return lDate;
}
/**
* 根据开始日期和结束日期获取之间的所有日期,并筛选出指定周次的日期,组成sql查询条件
* @param bdat
* @param edat
* @param weekly 周次,0周日,1周一,2周二,3周三,4周四,5周五,6周六。多个中间以逗号隔开,格式:1,2,3
* @param field 组成sql条件的字段
* @return
* @throws ParseException
*/
public static String getDateStringByBetwBdatEdat(String bdat,String edat,String weekly,String field) throws ParseException{
//首先根据查询开始日期及结束日期,获取时间段集合
List<String> datelist = DateFormatUtil.getDatesBetweenTwoDate(bdat, edat);
List<String> dateresultList=new ArrayList<String>();//定义筛选周次之后要查询的日期的结果集
for(String date : datelist){
if(null != weekly && !"".equals(weekly)){
//如果有传入周次条件,就按周次进行过滤日期
int cnt=DateFormatUtil.judgeInWeek(date,weekly);
if(cnt==0){//如果返回0,表示日期不在所选周次内,不纳入结果集
continue;
}
}
dateresultList.add(date);
}
return BohUtils.getSqlStrByList(dateresultList, 1000, field);//将查询日期的集合转化为sql条件
}
/**
* 描述:获取两个日期间的所有月份
* @param minDate
* @param maxDate
* @return
* @throws ParseException
*/
public static List<String> getMonthBetween(String minDate, String maxDate) {
ArrayList<String> result = new ArrayList<String>();
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
try {
min.setTime(YYYTMM.parse(minDate));
max.setTime(YYYTMM.parse(maxDate));
} catch (ParseException e) {
e.printStackTrace();
}
min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
Calendar curr = min;
while (curr.before(max)) {
result.add(YYYTMM.format(curr.getTime()));
curr.add(Calendar.MONTH, 1);
}
return result;
}
/**
* 描述:获取所在年的第一个月第一天
* @param today
* @return
*/
public static String getFirstMonth(String today) {
Calendar localTime = Calendar.getInstance();
try {
localTime.setTime(YYYY.parse(today));
} catch (ParseException e) {
e.printStackTrace();
}
return localTime.get(Calendar.YEAR) + "-01" + "-01";
}
/**
* 描述:两个日期间隔的天数
* @param date1 较早日期
* @param date2 较晚日期
* @return
*/
public static int getDay(String date1, String date2) {
Calendar calst = Calendar.getInstance();;
Calendar caled = Calendar.getInstance();
try {
calst.setTime(YYYY_MM_DD.parse(date1));
caled.setTime(YYYY_MM_DD.parse(date2));
} catch (ParseException e) {
e.printStackTrace();
}
//设置时间为0时
calst.set(Calendar.HOUR_OF_DAY, 0);
calst.set(Calendar.MINUTE, 0);
calst.set(Calendar.SECOND, 0);
caled.set(Calendar.HOUR_OF_DAY, 0);
caled.set(Calendar.MINUTE, 0);
caled.set(Calendar.SECOND, 0);
//得到两个日期相差的天数
int days = ((int)(caled.getTime().getTime() / 1000) -
(int)(calst.getTime().getTime() / 1000)) / 3600 / 24;
return days;
}
/**
* 描述:获取两个日期间的整月开始日期和结束日期
* @param minDate
* @param maxDate
* @return
*/
public static Map<String, String> getAllMonthDate(String minDate, String maxDate) {
String startDate = minDate; //整月的开始日期
String endDate = maxDate; //整月的结束日期
Calendar min = Calendar.getInstance();
Calendar max = Calendar.getInstance();
try {
min.setTime(YYYY_MM_DD.parse(minDate));
max.setTime(YYYY_MM_DD.parse(maxDate));
} catch (ParseException e) {
e.printStackTrace();
}
int day1 = min.get(Calendar.DAY_OF_MONTH);
int day2 = max.get(Calendar.DAY_OF_MONTH);
min.set(Calendar.MONTH, min.get(Calendar.MONTH) + 1);
min.set(Calendar.DAY_OF_MONTH, 1);
max.set(Calendar.DAY_OF_MONTH, 1);
max.add(Calendar.DATE, -1);
//若minDate不是当月第一天,则赋值startDate为下个月第一天
if (1 != day1) {
startDate = YYYY_MM_DD.format(min.getTime());
}
//若maxDate不是当月最后一天,则赋值endDate为上个月最后一天
if (Integer.valueOf(getMonthEndDay(maxDate)) != day2) {
endDate = YYYY_MM_DD.format(max.getTime());
}
Map<String, String> map = new HashMap<String, String>();
map.put("bdat", startDate);
map.put("edat", endDate);
return map;
}
/**
* 描述: 获取两个时间间隔的时长
* @param time1 开始时间
* @param time2 结束时间
* @return
*/
public static String getTimeLong(String time1, String time2) {
String hours = "";
String minutes = "";
try {
long interval = HH_mm.parse(time2).getTime() - HH_mm.parse(time1).getTime();
interval = interval > 0 ? interval : interval * -1;
interval /= 1000 * 60; //分
long hour = interval / 60;
long minute = interval % 60;
if (1 == String.valueOf(hour).length()) {
hours = "0" + hour;
} else {
hours = "" + hour;
}
if (1 == String.valueOf(minute).length()) {
minutes = "0" + minute;
} else {
minutes = "" + minute;
}
} catch (ParseException e) {
e.printStackTrace();
}
return hours + ":" + minutes;
}
/**
* Description: 获取当前对应下一年的年月日时分秒.
*/
public static String getNowInNextYear(){
Calendar curr = Calendar.getInstance();
curr.set(Calendar.YEAR, curr.get(Calendar.YEAR)+1);
Date date_year = curr.getTime();
return YYYY_MM_DD_HH_mm_ss.format(date_year);
}
public static void main(String[] args) {
try {
System.out.println(getDatesBetweenTwoDate("2017-06-01", "2017-06-01"));
} catch (ParseException e) {
e.printStackTrace();
}
}
}