import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
public class DateUtil {
/**
* @author yaoxh
* @date 2017-7-7 下午5:04:29
* @param date
* @param interval
* @param number
* @return 功能:日期加减 获得指定时间前后时间
*/
public static Date dateAdd(Date date,String interval,int number){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
if("y".equals(interval)){
cal.add(Calendar.YEAR, number);
}else if("M".equals(interval)){
cal.add(Calendar.MONTH, number);
}else if("d".equals(interval)){
cal.add(Calendar.DATE, number);
}else if("h".equals(interval)||"H".equals(interval)){
cal.add(Calendar.HOUR, number);
}else if("m".equals(interval)){
cal.add(Calendar.MINUTE, number);
}else if("s".equals(interval)){
cal.add(Calendar.SECOND, number);
}else {
return null;
}
return cal.getTime();
}
public static String dateAdd(String dateStr,String interval,int number,String frmt){
Date date = DateUtil.strToDate(dateStr, frmt);
Calendar cal = Calendar.getInstance();
cal.setTime(date);
if("y".equals(interval)){
cal.add(Calendar.YEAR, number);
}else if("M".equals(interval)){
cal.add(Calendar.MONTH, number);
}else if("d".equals(interval)){
cal.add(Calendar.DATE, number);
}else if("h".equals(interval)||"H".equals(interval)){
cal.add(Calendar.HOUR, number);
}else if("m".equals(interval)){
cal.add(Calendar.MINUTE, number);
}else if("s".equals(interval)){
cal.add(Calendar.SECOND, number);
}else {
return null;
}
return DateUtil.dateToStr(cal.getTime(),frmt);
}
/**
* @author yaoxh
* @date 2017-6-27 下午3:04:29
* @param startDate
* @param endDate
* @param interval 时间间隔 d天 H小时 ...
* @return 功能:获得时间段内的时间集合
*/
public static List<Date> getDateList(Date startDate,Date endDate,String interval){
List<Date> resList=new ArrayList<>();
if(startDate.before(endDate)||startDate.equals(endDate)){
while (startDate.before(endDate)){
resList.add(startDate);
startDate=DateUtil.dateAdd(startDate,interval,1);
}
resList.add(endDate);
}
return resList;
}
/**
* @author yaoxh
* @date 2018-6-20
* @param startDate
* @param interval 时间间隔 d天 H小时 ...
* @param length 要得到的日期列表长度
* @return 功能:获得时间段内的时间集合
*/
public static List<Date> getDateList(Date startDate, String interval, int length) {
List<Date> resList = new ArrayList<>();
for (int i = 0; i < length; i++) {
resList.add(DateUtil.dateAdd(startDate, interval, i));
}
return resList;
}
/**
* @author yaoxh
* @date 2017-6-27 下午3:04:29
* @param date 获取天数的月份 格式yyyy-MM
* @return 功能:获取当月的天数
*/
public static int getMonthDays(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.DATE, 1);
calendar.roll(Calendar.DATE, -1);
int maxDate = calendar.get(Calendar.DATE);
return maxDate;
}
/**
* @author yaoxh
* @date 2017-6-27 下午3:04:29
* @param date 获取当前小时
* @return 功能:获取当前小时
*/
public static int getHourOfDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.HOUR_OF_DAY);
}
/**
* @author yaoxh
* @date 2017-6-27 下午3:04:29
* @param startDate
* @param endDate
* @param dateType 时间间隔 d天 H小时 ...
* @return 功能:获得时间段内的时间集合
*/
public static List<Date> getDateList(Date startDate, Date endDate, String dateType, int step) {
List<Date> resList=new ArrayList<>();
if(startDate.before(endDate)||startDate.equals(endDate)){
while (startDate.before(endDate)){
resList.add(startDate);
startDate = DateUtil.dateAdd(startDate, dateType, step);
}
resList.add(endDate);
}
return resList;
}
/**
* @author yaoxh
* @date 2017-6-27 下午3:04:29
* @param startTime
* @param endTime
* @param dateType 时间间隔 d天 H小时 ...
* @return 功能:获得时间段内的时间集合
*/
public static List<String> getDateList(String startTime, String endTime, String dateType, String format, int step){
List<String> resList=new ArrayList<>();
Date startDate = DateUtil.strToDate(startTime, format);
Date endDate = DateUtil.strToDate(endTime, format);
if(startDate.before(endDate)||startDate.equals(endDate)){
while (startDate.before(endDate)){
resList.add(DateUtil.dateToStr(startDate, format));
startDate=DateUtil.dateAdd(startDate, dateType, step);
}
resList.add(DateUtil.dateToStr(endDate, format));
}
return resList;
}
/**
* @author yaoxh
* @date 2017-6-27 下午3:04:29
* @param dateType 时间间隔 d天 H小时 ...
* @return 功能:获得时间段内的时间集合
*/
public static List<String> getDateList(Date startDate, Date endDate, String dateType, String format, int step){
List<String> resList=new ArrayList<>();
if(startDate.before(endDate)||startDate.equals(endDate)){
while (startDate.before(endDate)){
resList.add(DateUtil.dateToStr(startDate, format));
startDate=DateUtil.dateAdd(startDate, dateType, step);
}
}
return resList;
}
/**
* @author yaoxh
* @date 2017-6-15 下午5:22:29
* @param date
* @return 功能:获得时间是周几
*/
public static String getWeek(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
int week=cal.get(Calendar.DAY_OF_WEEK);//1为周日 7为周六
String res="";
if(week==1){
res="周日";
}else if (week==2){
res="周一";
}else if (week==3){
res="周二";
}else if (week==4){
res="周三";
}else if (week==5){
res="周四";
}else if (week==6){
res="周五";
}else if (week==7){
res="周六";
}
return res;
}
/**
* @author yaoxinghui
* @date 2016-5-31 下午5:22:29
* @param date
* @return 功能:日期转字符串
*/
public static String dateToStr(Date date, String formatstr) {
SimpleDateFormat format = new SimpleDateFormat(formatstr);
String str = format.format(date);
return str;
}
/**
* @author yaoxinghui
* @date 2016-6-3 下午4:08:09
* @param formatstr
* @return 功能:获取当前指定格式时间字符串
*/
public static String getNewDate(String formatstr) {
Date date = new Date();
SimpleDateFormat format = new SimpleDateFormat(formatstr);
String str = format.format(date);
return str;
}
/**
* @author yaoxinghui
* @date 2016-5-31 下午5:22:15
* @param str
* @return 功能:字符串转日期
*/
public static Date strToDate(String str,String formatStr) {
SimpleDateFormat format = new SimpleDateFormat(formatStr);
Date date = null;
try {
date = format.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
/**
* 计算两个日期之间相差的天数
* @param smdate 较小的时间
* @param bdate 较大的时间
* @return 相差天数
* @throws ParseException
*/
public static int getDaysBetween(Date startTime,Date endTime)
{
Calendar cal = Calendar.getInstance();
cal.setTime(startTime);
Long time1 = cal.getTimeInMillis();
cal.setTime(endTime);
Long time2 = cal.getTimeInMillis();
Long between_days=(time2-time1)/(1000*3600*24);
return between_days.intValue();
}
/**
* 计算两个日期之间相差的天数
* @param smdate 较小的时间
* @param bdate 较大的时间
* @return 相差天数
* @throws ParseException
*/
public static int daysBetween(Date smdate,Date bdate) throws ParseException
{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
smdate=sdf.parse(sdf.format(smdate));
bdate=sdf.parse(sdf.format(bdate));
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600*24);
return Integer.parseInt(String.valueOf(between_days));
}
/**
* 计算两个日期之间相差的天数
* @param smdate 较小的时间
* @param bdate 较大的时间
* @return 相差天数
* @throws ParseException
*/
public static int hoursBetween(Date smdate,Date bdate) throws ParseException
{
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH");
smdate=sdf.parse(sdf.format(smdate));
bdate=sdf.parse(sdf.format(bdate));
Calendar cal = Calendar.getInstance();
cal.setTime(smdate);
long time1 = cal.getTimeInMillis();
cal.setTime(bdate);
long time2 = cal.getTimeInMillis();
long between_days=(time2-time1)/(1000*3600);
return Integer.parseInt(String.valueOf(between_days));
}
/**
* @author yaoxinghui
* @date 2016-6-3 下午4:00:10
* @param specifiedDay 指定日期
* @param format 格式
* @param day 数值 负数为前几天,正数为后几天
* @return 功能:计算指定日期前几天或后几天日期
*/
public static String getSpecifiedDay(String specifiedDay,String format, int day) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = simpleDateFormat.parse(specifiedDay);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
c.add(c.DATE, day);
String dayBefore = simpleDateFormat.format(c.getTime());
return dayBefore;
}
/**
* @author yaoxinghui
* @date 2016-6-3 下午4:05:58
* @param specifiedHour 日期字符串
* @param format 格式
* @param hour 数值 负数为前几小时,正数为后几小时
* @return 功能:计算指定时间前或后几小时时间
*/
public static String getSpecifiedHour(String specifiedHour, String format,int hour) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = simpleDateFormat.parse(specifiedHour);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
c.add(c.HOUR, hour);
String dayBefore = simpleDateFormat.format(c.getTime());
return dayBefore;
}
/**
* @author yaoxinghui
* @date 2016-6-3 下午4:05:58
* @param specifiedHour 日期字符串
* @param format 格式
* @param month 数值 负数为前几月,正数为后几月
* @return 功能:计算指定时间前或后几小时时间
*/
public static String getSpecifiedMonth(String specifiedHour, String format,int month) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = simpleDateFormat.parse(specifiedHour);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
c.add(c.MONTH, month);
String dayBefore = simpleDateFormat.format(c.getTime());
return dayBefore;
}
/**
* @author yaoxinghui
* @date 2016-6-3 下午4:05:58
* @param specifiedHour 日期字符串
* @param format 格式
* @param year 数值 负数为前几年,正数为后几年
* @return 功能:计算指定时间前或后几小时时间
*/
public static String getSpecifiedYear(String specifiedHour, String format,int year) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
Calendar c = Calendar.getInstance();
Date date = null;
try {
date = simpleDateFormat.parse(specifiedHour);
} catch (ParseException e) {
e.printStackTrace();
}
c.setTime(date);
c.add(c.YEAR, year);
String dayBefore = simpleDateFormat.format(c.getTime());
return dayBefore;
}
public static Timestamp strToTimestamp(String str,String format){
Timestamp ts = new Timestamp(System.currentTimeMillis());
String tsStr = dateToStr(strToDate(str,format),"yyyy-MM-dd HH:mm:ss");
try {
ts = Timestamp.valueOf(tsStr);
} catch (Exception e) {
e.printStackTrace();
}
return ts;
}
//通过日期计算该日期为一年中第几天
public static String getDateByDayOfYear(String param) throws ParseException {
String year = "20"+param.substring(0, 2);
int dayOfYear = Integer.valueOf(param.substring(2, param.length()))-1;
Date date1 = new Date();
String yyyy = DateUtil.dateToStr(date1, "yyyy");
Date start = new SimpleDateFormat("yyyyMMdd").parse(yyyy+"0101");
Calendar ca = Calendar.getInstance();
ca.setTime(start);
ca.add(Calendar.DATE,dayOfYear);
String month = "";
String date = "";
if(ca.get(Calendar.MONTH)+1<10){
month="0"+String.valueOf(ca.get(Calendar.MONTH)+1);
}else{
month = String.valueOf(ca.get(Calendar.MONTH)+1);
}
if(ca.get(Calendar.DATE)<10){
date = "0"+String.valueOf(ca.get(Calendar.DATE));
}else{
date = String.valueOf(ca.get(Calendar.DATE));
}
return String.valueOf(ca.get(Calendar.YEAR))+month+date;
}
//通过一年中第几天来计算日期
public static String getDayOfYearByDate(String date) throws ParseException {
Date dd = new SimpleDateFormat("yyyyMMdd").parse(date);
Calendar ca = Calendar.getInstance();
ca.setTime(dd);
String year = String.valueOf(ca.get(Calendar.YEAR)).substring(2,4);
int i = ca.get(Calendar.DAY_OF_YEAR);
String index = "";
if(i<10){
index = "00"+String.valueOf(i);
}else if(i>=10&&i<100){
index = "0"+String.valueOf(i);
}else{
index = String.valueOf(i);
}
return year+index;
}
//通过一年中第几天来计算日期
public static Integer getDayOfYear(String date) throws ParseException {
Date dd = new SimpleDateFormat("yyyyMMdd").parse(date);
Calendar ca = Calendar.getInstance();
ca.setTime(dd);
return ca.get(Calendar.DAY_OF_YEAR);
}
//获取指定日期月总天数
public static int getDaysOfMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 获得日期为当年的那一天
* @param date 传入日期
* @return
*/
public static int getDayOfYear(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cal.get(Calendar.DAY_OF_YEAR);
}
/**
* 获得该月第一天
* @param date 传入日期
* @return
*/
public static Date getFirstDayOfMonth(Date date){
Calendar cal = Calendar.getInstance();
//设置年份
cal.setTime(date);
//获取某月最小天数
int firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
//设置日历中月份的最小天数
cal.set(Calendar.DAY_OF_MONTH, firstDay);
//格式化日期
return cal.getTime();
}
/**
* 获得该月最后一天
* @param date 传入日期
* @return
*/
public static Date getLastDayOfMonth(Date date){
Calendar cal = Calendar.getInstance();
cal.setTime(date);
//获取某月最大天数
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
//设置日历中月份的最大天数
cal.set(Calendar.DAY_OF_MONTH, lastDay);
//格式化日期
return cal.getTime();
}
/**
* 获得当前日期本月的天数
* @param date 传入日期
* @return
*/
public static int getDaysOfCurrentMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_MONTH);
}
// 返回第几季度 1-3
//
/**
* 反回第几季度
* 季度一年四季, 第一季度:1月-3月, 第二季度:4月-6月, 第三季度:7月-9月, 第四季度:10月-12月
* @param month
* @return
*/
public static int getQuarterInMonth(int month) {
int months[] = { 1, 2, 3, 4 };
if (month >= 1 && month <= 3)
return months[0];
else if (month >= 4 && month <= 6)
return months[1];
else if (month >= 7 && month <= 9)
return months[2];
else
return months[3];
}
public static Date getQuarterFirstDate(String year,int quarter) {
String months[] = { "01", "04", "07", "10" };
String dateStr=year+months[quarter-1]+"01";
return getFirstDayOfMonth(DateUtil.strToDate(dateStr,"yyyyMMdd"));
}
public static Date getQuarterLastDate(String year,int quarter) {
String months[] = { "03", "06", "09", "12" };
String dateStr=year+months[quarter-1]+"01";
return getLastDayOfMonth(DateUtil.strToDate(dateStr,"yyyyMMdd"));
}
public static void main(String[] args) throws ParseException {
System.out.println(DateUtil.getMonthDays(DateUtil.strToDate("20180201","yyyyMMdd")));
}
}