JAVA关于Calendar类的使用

JAVA 专栏收录该内容
14 篇文章 0 订阅

需要注意的是,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,很详细。

获取本年的开始日期和结束日期

 

  • 0
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值