利用Calendar获取一段时间内的工作日

/**
  * 生成工作日开始(周一)-结束(周五)日期对的方法
  * 例如:
  * 输入:参数start_time ="2011-05-04"(星期三),end_time="2011-07-14"(星期四)
  * 返回:[
  *    ["2011-05-04","2011-05-06"],
  *    ["2011-05-09","2011-05-13"],
  *     ...,
  *    ["2011-07-4","2011-07-14"]
  *     ]
  * 说明:返回的List中的第一个元素数组中,第1个值是开始日期,第2个值是开始日期后一个星期5
  *     List中的最后一个元素数组中,第1个值是结束日期前一个星期1,第2个值是结束日期
  *     List中间部分每一个元素数组中,第1个值是星期1,第2个值是星期5
  * @param start_time
  * @param end_time
  * @return
  */

public List<String[]> getTimePairList(String start_time,String end_time){
  List<String[]> list = new ArrayList<String[]>();
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  Date start_date = null;
  Date end_date = null;
  
  try {
   start_date = sdf.parse(start_time);
   end_date = sdf.parse(end_time);
   int dayOfWeek1 = caculateWeekDays(start_date); //1->周日,2->周一
   int dayOfWeek2 = caculateWeekDays(end_date);
   int pre_days = 8 - dayOfWeek1; //i...saturday
   int last_days = dayOfWeek2; //sunday...i
   long diff_days = caculateDays(start_date,end_date);
   int remain_weeks = (int)(diff_days+2-pre_days-(last_days+1))/7;
   //计算第一个start、end对
   addPair(list,start_date,null,pre_days-2);
   
   //TODO添加
   for(int i=0; i<remain_weeks; i++){
    Date start_d = caculateDate(start_date, pre_days+i*7+1);
    addPair(list,start_d,null,4);
   }
   
   //计算最后一个start、end对
   addPair(list,null,end_date,-(last_days-2));
  } catch (ParseException e) {
   e.printStackTrace();
  }
  
  return list;
 }
 
 private void addPair(List<String[]> list, Date start_date, Date end_date, int days) {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  Calendar c = Calendar.getInstance();
  
  String[] start_end_pair = new String[2];
  if(start_date!=null && end_date==null){
   c.setTime(start_date);
   c.add(Calendar.DAY_OF_MONTH, days);
   Date d = c.getTime();
   start_end_pair[0] = sdf.format(start_date);
   start_end_pair[1] = sdf.format(d);
  }else if(start_date==null && end_date!=null){
   c.setTime(end_date);
   c.add(Calendar.DAY_OF_MONTH, days);
   Date d = c.getTime();
   start_end_pair[0] = sdf.format(d);
   start_end_pair[1] = sdf.format(end_date);
  }
  list.add(start_end_pair);
 }
 
 public Date caculateDate(Date start_date, int days){
  Calendar c = Calendar.getInstance();
  c.setTime(start_date);
  c.add(Calendar.DAY_OF_MONTH, days);
  return c.getTime();
 }
 
 public int caculateWeekDays(Date date){
  Calendar c = Calendar.getInstance();
  c.setTime(date);
  return c.get(Calendar.DAY_OF_WEEK);
 }
 
 private int caculateDays(Date start_date, Date end_date){
  return Math.round(end_date.getTime()/(1000*60*60*24)-start_date.getTime()/(1000*60*60*24));
 }

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dyyaries

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值