最近用到计算月份的第一天跟最后一天了,然后发现了公司这个日期处理工具,挺不错的,分享给大家!里面可以处理年、季度、月、旬、周之类的开始结束天数,每个方法都有注释,挺好用的,有些方法带有参数偏移量,有些不带,刚看到的时候也挺郁闷,到底是什么东西,就自己测试了一下,这里就举一个例子吧!
偏移量解释 比如今天时间是2015-11-06
getFirstDayOfYear(-1) 就是2014-01-01 getFirstDayOfYear(1)就是2016-01-01
getFirstDayOfMonth(-1) 就是2015-10-01 getFirstDayOfMonth(1)就是2015-12-01
getFirstDayOfMonth(0) 就是2015-11-01 等同于getFirstDayOfMonth()
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateHelper {
/**
* 时间范围:年
*/
public static final int YEAR = 1;
/**
* 时间范围:季度
*/
public static final int QUARTER = 2;
/**
* 时间范围:月
*/
public static final int MONTH = 3;
/**
* 时间范围:旬
*/
public static final int TENDAYS = 4;
/**
* 时间范围:周
*/
public static final int WEEK = 5;
/**
* 时间范围:日
*/
public static final int DAY = 6;
/* 基准时间 */
private Date fiducialDate = null;
private Calendar cal = null;
private DateHelper(Date fiducialDate) {
if (fiducialDate != null) {
this.fiducialDate = fiducialDate;
} else {
this.fiducialDate = new Date(System.currentTimeMillis());
}
this.cal = Calendar.getInstance();
this.cal.setTime(this.fiducialDate);
this.cal.set(Calendar.HOUR_OF_DAY, 0);
this.cal.set(Calendar.MINUTE, 0);
this.cal.set(Calendar.SECOND, 0);
this.cal.set(Calendar.MILLISECOND, 0);
this.fiducialDate = this.cal.getTime();
}
/**
* 获取DateHelper实例
*
* @param fiducialDate 基准时间
* @return
*/
public static DateHelper getInstance(Date fiducialDate) {
return new DateHelper(fiducialDate);
}
/**
* 获取DateHelper实例, 使用当前时间作为基准时间
*
* @return
*/
public static DateHelper getInstance() {
return new DateHelper(null);
}
/**
* 获取年的第一天
*
* @param offset 偏移量
* @return
*/
public Date getFirstDayOfYear(int offset) {
cal.setTime(this.fiducialDate);
cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) + offset);
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
return cal.getTime();
}
/**
* 获取年的最后一天
*
* @param offset 偏移量
* @return
*/
public Date getLastDayOfYear(int offset) {
cal.setTime(this.fiducialDate);
cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) + offset);
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);
return cal.getTime();
}
/**
* 获取季度的第一天
*
* @param offset 偏移量
* @return
*/
public Date getFirstDayOfQuarter(int offset) {
cal.setTime(this.fiducialDate);
cal.add(Calendar.MONTH, offset * 3);
int mon = cal.get(Calendar.MONTH);
if (mon >= Calendar.JANUARY && mon <= Calendar.MARCH) {
cal.set(Calendar.MONTH, Calendar.JANUARY);
cal.set(Calendar.DAY_OF_MONTH, 1);
}
if (mon >= Calendar.APRIL && mon <= Calendar.JUNE) {
cal.set(Calendar.MONTH, Calendar.APRIL);
cal.set(Calendar.DAY_OF_MONTH, 1);
}
if (mon >= Calendar.JULY && mon <= Calendar.SEPTEMBER) {
cal.set(Calendar.MONTH, Calendar.JULY);
cal.set(Calendar.DAY_OF_MONTH, 1);
}
if (mon >= Calendar.OCTOBER && mon <= Calendar.DECEMBER) {
cal.set(Calendar.MONTH, Calendar.OCTOBER);
cal.set(Calendar.DAY_OF_MONTH, 1);
}
return cal.getTime();
}
/**
* 获取季度的最后一天
*
* @param offset 偏移量
* @return
*/
public Date getLastDayOfQuarter(int offset) {
cal.setTime(this.fiducialDate);
cal.add(Calendar.MONTH, offset * 3);
int mon = cal.get(Calendar.MONTH);
if (mon >= Calendar.JANUARY && mon <= Calendar.MARCH) {
cal.set(Calendar.MONTH, Calendar.MARCH);
cal.set(Calendar.DAY_OF_MONTH, 31);
}
if (mon >= Calendar.APRIL && mon <= Calendar.JUNE) {
cal.set(Calendar.MONTH, Calendar.JUNE);
cal.set(Calendar.DAY_OF_MONTH, 30);
}
if (mon >= Calendar.JULY && mon <= Calendar.SEPTEMBER) {
cal.set(Calendar.MONTH, Calendar.SEPTEMBER);
cal.set(Calendar.DAY_OF_MONTH, 30);
}
if (mon >= Calendar.OCTOBER && mon <= Calendar.DECEMBER) {
cal.set(Calendar.MONTH, Calendar.DECEMBER);
cal.set(Calendar.DAY_OF_MONTH, 31);
}
return cal.getTime();
}
/**
* 获取月的第一天
*
* @param offset 偏移量
* @return
*/
public Date getFirstDayOfMonth(int offset) {
cal.setTime(this.fiducialDate);
cal.add(Calendar.MONTH, offset);
cal.set(Calendar.DAY_OF_MONTH, 1);
return cal.getTime();
}
/**
* 获取月的最后一天
*
* @param offset 偏移量
* @return
*/
public Date getLastDayOfMonth(int offset) {
cal.setTime(this.fiducialDate);
cal.add(Calendar.MONTH, offset + 1);
cal.set(Calendar.DAY_OF_MONTH, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
return cal.getTime();
}
/**
* 获取月的第一天
*
* @param someDate
* @return
*/
public Date getFirstDayOfMonth(Date someDate) {
Calendar ca = Calendar.getInstance();
ca.setTime(someDate); // someDate 为你要获取的那个月的时间
ca.set(Calendar.DAY_OF_MONTH, 1);
Date firstDate = ca.getTime();
return firstDate;
}
/**
* 获取月的最后一天
*
* @param someDate
* @return
*/
public Date getLastDayOfMonth(Date someDate) {
//System.out.println("AAAAAA");
Calendar ca = Calendar.getInstance();
ca.setTime(someDate); // someDate 为你要获取的那个月的时间
ca.add(Calendar.MONTH, 1);
ca.set(Calendar.DAY_OF_MONTH, 1);
ca.add(Calendar.DAY_OF_MONTH, -1);
Date lastDate = ca.getTime();
return lastDate;
}
/**
* 获取旬的第一天
*
* @param offset 偏移量
* @return
*/
public Date getFirstDayOfTendays(int offset) {
cal.setTime(this.fiducialDate);
int day = cal.get(Calendar.DAY_OF_MONTH);
if (day >= 21) {
day = 21;
} else if (day >= 11) {
day = 11;
} else {
day = 1;
}
if (offset > 0) {
day = day + 10 * offset;
int monOffset = day / 30;
day = day % 30;
cal.add(Calendar.MONTH, monOffset);
cal.set(Calendar.DAY_OF_MONTH, day);
} else {
int monOffset = 10 * offset / 30;
int dayOffset = 10 * offset % 30;
if ((day + dayOffset) > 0) {
day = day + dayOffset;
} else {
monOffset = monOffset - 1;
day = day - dayOffset - 10;
}
cal.add(Calendar.MONTH, monOffset);
cal.set(Calendar.DAY_OF_MONTH, day);
}
return cal.getTime();
}
/**
* 获取旬的最后一天
*
* @param offset 偏移量
* @return
*/
public Date getLastDayOfTendays(int offset) {
Date date = getFirstDayOfTendays(offset + 1);
cal.setTime(date);
cal.add(Calendar.DAY_OF_MONTH, -1);
return cal.getTime();
}
/**
* 获取周的第一天(MONDAY)
*
* @param offset 偏移量
* @return
*/
public Date getFirstDayOfWeek(int offset) {
cal.setTime(this.fiducialDate);
cal.add(Calendar.DAY_OF_MONTH, offset * 7);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
return cal.getTime();
}
/**
* 获取周的最后一天(SUNDAY)
*
* @param offset 偏移量
* @return
*/
public Date getLastDayOfWeek(int offset) {
cal.setTime(this.fiducialDate);
cal.add(Calendar.DAY_OF_MONTH, offset * 7);
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
cal.add(Calendar.DAY_OF_MONTH, 6);
return cal.getTime();
}
/**
* 获取周的第一天(MONDAY)
*
* @param someDate
* @return
*/
public Date getFirstDayOfWeek(Date someDate) {
Calendar ca = Calendar.getInstance();
ca.setTime(someDate); // someDate 为你要获取的那个月的时间
ca.set(Calendar.DAY_OF_WEEK, ca.getFirstDayOfWeek());
return ca.getTime();
}
/**
* 获取周的最后一天(SUNDAY)
*
* @param someDate
* @return
*/
public Date getLastDayOfWeek(Date someDate) {
Calendar ca = Calendar.getInstance();
ca.setTime(someDate); // someDate 为你要xl获取的那个月的时间
ca.set(Calendar.DAY_OF_WEEK, ca.getFirstDayOfWeek() + 6);
return ca.getTime();
}
/**
* 根据日历的规则,为基准时间添加指定日历字段的时间量
*
* @param field 日历字段, 使用Calendar类定义的日历字段常量
* @param offset 偏移量
* @return
*/
public Date add(int field, int offset) {
cal.setTime(this.fiducialDate);
cal.add(field, offset);
return cal.getTime();
}
/**
* 根据日历的规则,为基准时间添加指定日历字段的时间量
*
* @param field 日历字段, 使用Calendar类定义的日历字段常量
* @param offset 偏移量
* @return
*/
public Date offset(int field, int offset) {
cal.setTime(this.fiducialDate);
cal.add(field, offset);
return cal.getTime();
}
/**
* 根据日历的规则,为基准时间添加指定日历字段的时间量
*
* @param field 日历字段, 使用Calendar类定义的日历字段常量
* @param offset 偏移量
* @param format 格式
* @return
*/
public String offset(int field, int offset,String format) {
DateFormat df = new SimpleDateFormat(format);
cal.setTime(this.fiducialDate);
cal.add(field, offset);
return df.format(cal.getTime());
}
/**
* 根据日历的规则,为基准时间添加指定日历字段的单个时间单元
*
* @param field 日历字段, 使用Calendar类定义的日历字段常量
* @param up 指定日历字段的值的滚动方向。true:向上滚动 / false:向下滚动
* @return
*/
public Date roll(int field, boolean up) {
cal.setTime(this.fiducialDate);
cal.roll(field, up);
return cal.getTime();
}
/**
* 得到系统当前年份
*
* @return
*/
public String getNowYear() {
Calendar CD = Calendar.getInstance();
int YY = CD.get(Calendar.YEAR);
return Integer.toString(YY);
}
public String getLastYear() {
Calendar CD = Calendar.getInstance();
int YY = CD.get(Calendar.YEAR)-1;
return Integer.toString(YY);
}
/**
* 得到系统当前月份
*
* @return
*/
public String getNowMonth() {
Calendar CD = Calendar.getInstance();
int MM = CD.get(Calendar.MONTH) + 1;
return Integer.toString(MM);
}
public String getLastMonth(int i) {
Calendar CD = Calendar.getInstance();
int MM = CD.get(Calendar.MONTH) - i;
return Integer.toString(MM);
}
/**
* 得到系统当前日
*
* @return
*/
public String getNowtDay() {
Calendar CD = Calendar.getInstance();
int DD = CD.get(Calendar.DATE);
return Integer.toString(DD);
}
/**
* 得到当前年份
*
* @return
*/
public int getNowYear(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int YY = CD.get(Calendar.YEAR);
return YY;
}
public int getLastYear(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int YY = CD.get(Calendar.YEAR)-1;
return YY;
}
/**
* 得到当前月份
*
* @return
*/
public int getNowMonth(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int MM = CD.get(Calendar.MONTH) + 1;
return MM;
}
/**
* 获取当前月的上一月
*
* @param date
* @return
*/
public int getLastMonth(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int MM = CD.get(Calendar.MONTH);
return MM;
}
public int getLastMonth1(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int MM = CD.get(Calendar.MONTH) - 1;
return MM;
}
public String getPreviousMonthEnd() {
String str = "";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar lastDate = Calendar.getInstance();
lastDate.add(Calendar.MONTH, -1);//减一个月
lastDate.set(Calendar.DATE, 1);//把日期设置为当月第一天
lastDate.roll(Calendar.DATE, -1);//日期回滚一天,也就是本月最后一天
str = sdf.format(lastDate.getTime());
return str;
}
/**
* 得到当前日
*
* @return
*/
public int getNowtDay(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int DD = CD.get(Calendar.DATE);
return DD;
}
/**
* 得到当前小时
*
* @return
*/
public int getNowHour(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int DD = CD.get(Calendar.HOUR_OF_DAY);
return DD;
}
public int getNowNumWeek(Date date) {
Calendar CD = Calendar.getInstance();
CD.setTime(date);
int DD = CD.get(Calendar.WEEK_OF_MONTH);
return DD;
}
public static String getNumDayOfWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int intWeek = calendar.get(Calendar.DAY_OF_WEEK);
String strReturn = " ";
switch (intWeek) {
case Calendar.SUNDAY:
strReturn = "0";
break;
case Calendar.MONDAY:
strReturn = "1";
break;
case Calendar.TUESDAY:
strReturn = "2";
break;
case Calendar.WEDNESDAY:
strReturn = "3";
break;
case Calendar.THURSDAY:
strReturn = "4";
break;
case Calendar.FRIDAY:
strReturn = "5";
break;
case Calendar.SATURDAY:
strReturn = "6";
break;
}
return strReturn;
}
/**
* 把字符串转换为日期
*
* @param dateStr 日期字符串
* @param format 日期格式
* @return
*/
public static Date strToDate(String dateStr, String format) {
Date date = null;
if (dateStr != null && (!dateStr.equals(""))) {
DateFormat df = new SimpleDateFormat(format);
try {
date = df.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
}
return date;
}
/**
* 把字符串转换为日期,日期的格式为yyyy-MM-dd HH:ss
*
* @param dateStr 日期字符串
* @return
*/
public static Date strToDate(String dateStr) {
Date date = null;
if (dateStr != null && (!dateStr.equals(""))) {
if (dateStr.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
dateStr = dateStr + " 00:00";
} else if (dateStr.matches("\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}")) {
dateStr = dateStr + ":00";
} else {
System.out.println(dateStr + " 格式不正确");
return null;
}
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:ss");
try {
date = df.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
}
return date;
}
/**
* 把日期转换为字符串
*
* @param date 日期实例
* @param format 日期格式
* @return
*/
public static String dateToStr(Date date, String format) {
return (date == null) ? "" :
new SimpleDateFormat(format).format(date);
}
/**
* 取得当前日期 年-月-日
*
* @return
*/
public static String getCurrentDate() {
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
return f.format(Calendar.getInstance().getTime());
}
/**
* util date 转成字符串
*
* @param date
* @return
*/
public static String getStringDateTime(Date date) {
String str = "";
if (date != null)
str = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date).toString();
return str;
}
/**
* 返回指定日历中第几天的时间
*
* @param ref
* @return
*/
public static Date getDayOfWeekRef(Calendar calendar, int ref) {
int thisDay = calendar.get(Calendar.DAY_OF_WEEK);
int refDay = ref - thisDay;
calendar.add(Calendar.DATE, refDay);
return new Date(calendar.getTimeInMillis());
}
/**
* 返回本周日历中第几天的时间
*
* @param ref
* @return
*/
public static Date getDayOfWeekRef(int ref) {
Calendar c = Calendar.getInstance();
int thisDay = c.get(Calendar.DAY_OF_WEEK);
int refDay = ref - thisDay;
c.add(Calendar.DATE, refDay);
return new Date(c.getTimeInMillis());
}
/**
* 判断星期
*
* @param date
* @return
*/
public static String getDayOfWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int intWeek = calendar.get(Calendar.DAY_OF_WEEK);
String strReturn = " ";
switch (intWeek) {
case Calendar.SUNDAY:
strReturn = "Sunday";
break;
case Calendar.MONDAY:
strReturn = "Monday";
break;
case Calendar.TUESDAY:
strReturn = "Tuesday";
break;
case Calendar.WEDNESDAY:
strReturn = "Wednesday";
break;
case Calendar.THURSDAY:
strReturn = "Thursday";
break;
case Calendar.FRIDAY:
strReturn = "Friday";
break;
case Calendar.SATURDAY:
strReturn = "Saturday";
break;
}
return strReturn;
}
/**
* 判断中文星期
*
* @param date
* @return
*/
public static String getGBKDayOfWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int intWeek = calendar.get(Calendar.DAY_OF_WEEK);
String strReturn = " ";
switch (intWeek) {
case Calendar.SUNDAY:
strReturn = "星期日";
break;
case Calendar.MONDAY:
strReturn = "星期一";
break;
case Calendar.TUESDAY:
strReturn = "星期二";
break;
case Calendar.WEDNESDAY:
strReturn = "星期三";
break;
case Calendar.THURSDAY:
strReturn = "星期四";
break;
case Calendar.FRIDAY:
strReturn = "星期五";
break;
case Calendar.SATURDAY:
strReturn = "星期六";
break;
}
return strReturn;
}
/**
* 两个日期相隔天数
* @param start
* @param end
* @return
*/
public static int getDays(Date start,Date end){
Calendar cal = Calendar.getInstance();
cal.setTime(start);
long time1 = cal.getTimeInMillis();
cal.setTime(end);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
return (int)between_days;
}
}