需要注意的是,Calendar默认每周的第一天是周末,与中国的习惯不同
所以需要将每周的周一作作为开始日期
-
//并将每周一作为一周的开始
-
//默认周日是每周的开始日期
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
另外,Calendar中每个月的起点是0天,所以需要将每月的第一日作为每个月的开始日期,已获得完整的月份天数
//将每月的第一日作为每个月的开始日期,以获得完整的月份天数。
calendar.set(Calendar.DAY_OF_MONTH, 1);
Calendar中获得当前日期时间的方法
Calendar dota =Calendar.getInstance(); //创建对象
int y= dota.get(dota.YEAR); //当前年
int m=dota.get(dota.MINUTE); //当前分
int h=dota.get(dota.DATE); //当前日
int oh=dota.get(dota.HOUR_OF_DAY); //当前时
int mon=dota.get(dota.MONTH)+1; //当前月
int se = dota.get(dota.SECOND); //当前秒
int we = dota.get(dota.DAY_OF_WEEK); //当前星期几
/**
* 获取limit天前的日期
*/
public static Date getDateBefore(Date d, Integer limit) {
Calendar now = Calendar.getInstance();
now.setTime(d);
now.set(Calendar.DATE, now.get(Calendar.DATE) - limit);
return now.getTime();
}
/**
* 描述: 获取最近连续limit天的日期
*
*/
@SuppressWarnings("unused")
@Deprecated
private List<String> getRecentDateList(Integer limit) {
List<String> recentDateList = new ArrayList<>();
Date currentDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
c.setTime(currentDate);
c.add(Calendar.DAY_OF_YEAR, -(limit - 1));
for (int i = 0; i < limit; i++) {
recentDateList.add(sdf.format(c.getTime()));
c.add(Calendar.DAY_OF_YEAR, 1);
}
return recentDateList;
}
/**
* 描述:计算当前选择日期的总天数
*/
private Integer getTotalDayNum(Map<String, List<String>> recentDateMap){
Integer dayNum = 0;
for(String key : recentDateMap.keySet()) {
dayNum += recentDateMap.get(key).size();
}
return dayNum;
}
/**
* 计算两个日期间相差的月数
*/
public static int getMonthDiff(Date startDate,Date endDate) {
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.setTime(endDate);
c2.setTime(startDate);
if(c1.getTimeInMillis() < c2.getTimeInMillis()) return 0;
int year1 = c1.get(Calendar.YEAR);
int year2 = c2.get(Calendar.YEAR);
int month1 = c1.get(Calendar.MONTH);
int month2 = c2.get(Calendar.MONTH);
int day1 = c1.get(Calendar.DAY_OF_MONTH);
int day2 = c2.get(Calendar.DAY_OF_MONTH);
// 获取年的差值 假设 d1 = 2015-8-16 d2 = 2011-9-30
int yearInterval = year1 - year2;
// 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数
if(month1 < month2 || month1 == month2 && day1 < day2) yearInterval --;
// 获取月数差值
int monthInterval = (month1 + 12) - month2 ;
if(day1 < day2) monthInterval --;
monthInterval %= 12;
return yearInterval * 12 + monthInterval;
}
/**
* 获取相差的月份
*/
public Map<String, List<String>> getMonth(Date beginDate,Date endDate) throws ParseException {
Map<String, List<String>> recentDateMap = new LinkedHashMap<>();
Calendar calendar = Calendar.getInstance();
Calendar currentCal = Calendar.getInstance();
int monthDiff = getMonthDiff(beginDate,endDate);
calendar.add(Calendar.MONTH, -monthDiff);
calendar.set(Calendar.DAY_OF_MONTH, 1);
while (true) {
setRecentDateMap(recentDateMap, (calendar.get(Calendar.YEAR)+"-"+(calendar.get(Calendar.MONTH) + 1)), sdf.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_YEAR, 1);
if(calendar.after(currentCal)) {
break;
}
}
return recentDateMap;
}
/**
* 描述:日历推算选择
*/
private Map<String, List<String>> getRecentDateMap (Integer limit) {
Map<String, List<String>> recentDateMap = new LinkedHashMap<>();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar calendar = Calendar.getInstance();
Calendar currentCal = Calendar.getInstance();
//当选择30天时
if(limit == x天) {
//以本周为起点再向前推算三周
calendar.add(Calendar.WEEK_OF_YEAR, -3);
//并将每周一作为一周的开始
//默认周日是每周的开始日期
calendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
for(int i = 1; i <= 4; i++) {
for(int weekDay = 1; weekDay <= 7; weekDay++) {
setRecentDateMap(recentDateMap, "第" + i + "周", sdf.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_YEAR, 1);
//判断累加日期是否超出当前的日期
if(calendar.after(currentCal)) {
break;
}
}
}
} else if(limit == x || limit == x1) {
//当选择天数多时,则以当前月为起点,再向前推算三个月或五个月
if(limit == 90) {
calendar.add(Calendar.MONTH, -3);
} else {
calendar.add(Calendar.MONTH, -5);
}
//将每月的第一日作为每个月的开始日期,以获得完整的月份天数。
//默认每月的开始日期是0
calendar.set(Calendar.DAY_OF_MONTH, 1);
while (true) {
setRecentDateMap(recentDateMap, (calendar.get(Calendar.MONTH) + 1) + "月份", sdf.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_YEAR, 1);
if(calendar.after(currentCal)) {
break;
}
}
} else {
//以当前日期为起点向前推算(limit-1)天
calendar.add(Calendar.DAY_OF_YEAR, -(limit - 1));
for(int i = 0; i < limit; i++) {
setRecentDateMap(recentDateMap, sdf.format(calendar.getTime()), sdf.format(calendar.getTime()));
calendar.add(Calendar.DAY_OF_YEAR, 1);
}
}
return recentDateMap;
}
/**
* 描述:将推算好的日期放入map中
key:2018-12
value:2018-12-01
*/
private void setRecentDateMap(Map<String, List<String>> recentDateMap, String key, String value) {
//如果存在key,则向当前list中继续添加日期
if(recentDateMap.containsKey(key)) {
recentDateMap.get(key).add(value);
} else {
List<String> recentDateList = new ArrayList<>();
recentDateList.add(value);
recentDateMap.put(key, recentDateList);
}
}
代码比较匆忙,许多注释也没有加,后期也只是对其中一部分进行添加注释了(主要是懒),想要更深了解的同学,可以移驾官方API,很详细。