需求描述
- 输入开始时间和结束时间,获取时间范围内的所有日期,月份、年份
(输入可以为"yyyy-MM-dd HH:mm:ss"或者"yyyy-MM-dd")
一、输入开始时间和结束时间,返回时间范围内中的所有日期列表
/**
* 传入两个时间范围,返回这两个时间范围内的所有日期,并保存在一个集合中
*
* @param beginTime
* @param endTime
* @return
* @throws Exception
*/
public static List<String> findEveryDay(String beginTime, String endTime)
throws Exception {
//创建一个放所有日期的集合
List<String> dates = new ArrayList();
//创建时间解析对象规定解析格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//将传入的时间解析成Date类型,相当于格式化
Date dBegin = sdf.parse(beginTime);
Date dEnd = sdf.parse(endTime);
//将格式化后的第一天添加进集合
dates.add(sdf.format(dBegin));
//使用本地的时区和区域获取日历
Calendar calBegin = Calendar.getInstance();
//传入起始时间将此日历设置为起始日历
calBegin.setTime(dBegin);
//判断结束日期前一天是否在起始日历的日期之后
while (dEnd.after(calBegin.getTime())) {
//根据日历的规则:月份中的每一天,为起始日历加一天
calBegin.add(Calendar.DAY_OF_MONTH, 1);
//得到的每一天就添加进集合
dates.add(sdf.format(calBegin.getTime()));
//如果当前的起始日历超过结束日期后,就结束循环
}
return dates;
}
测试输出结果:
二、输入开始时间和结束时间,返回时间范围内中的所有月份列表
/**
* 获取两个日期之间的所有月份 (年月)
*
* @param startTime
* @param endTime
* @return:list
*/
public static List<String> getMonthBetweenDate(String startTime, String endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
// 声明保存日期集合
List<String> list = new ArrayList<>();
try {
// 转化成日期类型
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
//用Calendar 进行日期比较判断
Calendar calendar = Calendar.getInstance();
while (startDate.getTime() <= endDate.getTime()) {
// 把日期添加到集合
list.add(sdf.format(startDate));
// 设置日期
calendar.setTime(startDate);
//把月数增加 1
calendar.add(Calendar.MONTH, 1);
// 获取增加后的日期
startDate = calendar.getTime();
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
输入:"2022-07-01 00:00:00 " "2022-10-27 23:59:59 "
返回结果:[2022-07,2022-08,2022-09,2022-10]
三、输入开始时间和结束时间,返回时间范围内中的所有年份列表
/**
* 获取两个日期之间的所有年
*
* @param startTime
* @param endTime
* @return:list
*/
public static List<String> getYearBetweenDate(String startTime, String endTime) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
// 声明保存日期集合
List<String> list = new ArrayList<>();
try {
// 转化成日期类型
Date startDate = sdf.parse(startTime);
Date endDate = sdf.parse(endTime);
//用Calendar 进行日期比较判断
Calendar calendar = Calendar.getInstance();
while (startDate.getTime() <= endDate.getTime()) {
// 把日期添加到集合
list.add(sdf.format(startDate));
// 设置日期
calendar.setTime(startDate);
//把年数增加 1
calendar.add(Calendar.YEAR, 1);
// 获取增加后的日期
startDate = calendar.getTime();
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
输入:"2020-07-01 00:00:00 " "2022-10-27 23:59:59 "
返回结果:[2020,2021,2022]
五、计算2个日期之间相差的 以年、月、日为单位,各自计算结果是多少
/**
* 计算2个日期之间相差的 以年、月、日为单位,各自计算结果是多少
* 比如:2011-02-02 到 2017-03-02
* 以年为单位相差为:6年
* 以月为单位相差为:73个月
* 以日为单位相差为:2220天
* @param fromDate
* @param toDate
* @return
*/
public static JSONObject dayCompare(Date fromDate,Date toDate){
Calendar from = Calendar.getInstance();
from.setTime(fromDate);
Calendar to = Calendar.getInstance();
to.setTime(toDate);
//只要年月
int fromYear = from.get(Calendar.YEAR);
int fromMonth = from.get(Calendar.MONTH);
int toYear = to.get(Calendar.YEAR);
int toMonth = to.get(Calendar.MONTH);
int year = toYear - fromYear;
int month = toYear * 12 + toMonth - (fromYear * 12 + fromMonth);
int day = (int) ((to.getTimeInMillis() - from.getTimeInMillis()) / (24 * 3600 * 1000));
JSONObject jsonObject = new JSONObject();
jsonObject.put("year",year);
jsonObject.put("month",month);
jsonObject.put("day",day);
log.info(jsonObject.toJSONString());
return jsonObject;
}
六、在指定的时间上增加指定月数获取到一个新日期
/**
* 在指定的时间上增加指定月数获取到一个新日期
* @param sourceDate 指定时间
* @param month 指定增加的月数
* @return
*/
public static Date stepMonth(Date sourceDate, int month) {
Calendar c = Calendar.getInstance();
c.setTime(sourceDate);
c.add(Calendar.MONTH, month);
return c.getTime();
}