week

package com.isoftstone.dcf.portal.bmanager.report.common;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class WeekReportDateUtils {
    
    /**
     * (周)计算(周) 上期和去年同期的起止日期和起止周
     * 计算上期的起止时间 和去年同期  type 0本期    1上期   2去年同期
     * 起始日期key  beginkey  endkey
     * 本期:begin    end
     * (标记)此方法暂无问题
     */
    public static Map<String,String> getWeekDate(int type,String beginkey,String endkey,String begin,String end){
        //将时间推算到所在周的第一天和最后一天
        begin = getWeekStartAndEnd(0,begin);//计算开始时间所在的周的周一
        end = getWeekStartAndEnd(1,end);//计算结束时间所在周的周末最后一天
        //开始日期和结束日期分布所在的周
        int beginWeek = getDateOfWeek(begin);
        int endWeek = getDateOfWeek(end);
        
        Map<String, String> map = new HashMap<String, String>();
        DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = null; // 开始日期
        Date dEnd = null; // 结束日期
        try {
            date1 = sdf.parse(begin);
            dEnd = sdf.parse(end);
            
            Calendar calBegin = Calendar.getInstance();
            // 使用给定的 Date 设置此 Calendar 的时间
            calBegin.setTime(date1);
            Calendar calEnd = Calendar.getInstance();
            // 使用给定的 Date 设置此 Calendar 的时间
            calEnd.setTime(dEnd);
            calBegin.setFirstDayOfWeek(Calendar.MONDAY);  //本年周一为第一天
            calEnd.setFirstDayOfWeek(Calendar.MONDAY);

            calBegin.setMinimalDaysInFirstWeek(1);//第一个周最少为1天
            calEnd.setMinimalDaysInFirstWeek(1);
            
            if (type == 1) {// 计算上期
                // 计算查询时间段相隔多少周
                int week = getWeekCount(sdf.format(date1),sdf.format(dEnd));
                //计算上一年有多少个周
                int sweekCount = getAllWeeks(String.valueOf(calBegin.get(Calendar.YEAR)-1));
                //计算本期年的本周 往前推是否涉及跨年
                if(beginWeek-week<=0){//需要跨年  
                    //去年应该推到的周
                    int qunianw = sweekCount-(week-beginWeek);
                    calBegin.add(Calendar.YEAR,-1);
                    if(qunianw==53){//最后一周是12月31号结束
                       calBegin.set(Calendar.MONTH, 11);
                       calBegin.set(Calendar.DAY_OF_MONTH,31);
                    }else if(qunianw==1){
                        //第一周是1月1号开始
                         calBegin.set(Calendar.MONTH,0);
                         calBegin.set(Calendar.DAY_OF_MONTH,1);
                    }else{
                        //如果不是开始周和结束周就这么干
                        calBegin.set(Calendar.WEEK_OF_YEAR,qunianw);    
                    }
                }else{
                    //不需要跨年
                    //去年应该推到的周
                    int jinnianweek = beginWeek-week;
                    if(jinnianweek==1){
                        //第一周是1月1号开始
                         calBegin.set(Calendar.MONTH,0);
                         calBegin.set(Calendar.DAY_OF_MONTH,1);
                    }else{
                        calBegin.set(Calendar.WEEK_OF_YEAR,jinnianweek);// 像前推week周
                    }
                }
                //计算本期年的本周 往前推是否涉及跨年
                if(endWeek-week<=0){//需要跨年
                    calEnd.add(Calendar.YEAR, -1);
                    // 去年应该推到的周
                    int qunianw = sweekCount - (week - endWeek);
                    if (qunianw == 53) {// 最后一周是12月31号结束
                        calEnd.set(Calendar.MONTH, 11);
                        calEnd.set(Calendar.DAY_OF_MONTH, 31);
                    } else if (qunianw == 1) {
                        // 第一周是1月1号开始
                        calEnd.set(Calendar.MONTH, 0);
                        calEnd.set(Calendar.DAY_OF_MONTH, 1);
                    } else {
                        // 如果不是开始周和结束周就这么干
                        calEnd.set(Calendar.WEEK_OF_YEAR, qunianw);
                    }
                }else{
                    calEnd.add(Calendar.WEEK_OF_YEAR, -week);// 像前推week周
                }
                map.put(beginkey, getWeekStartAndEnd(0,sdf.format(calBegin.getTime())));
                map.put(endkey, getWeekStartAndEnd(1,sdf.format(calEnd.getTime())));
//                //得到起始周的周一   和结束周的周末
            }else if(type==2){
                calBegin.add(Calendar.YEAR, -1);// 去年同期
                calEnd.add(Calendar.YEAR, -1);// 去年同期
                if (beginWeek == 53) {// 最后一周是12月31号结束
                    calBegin.set(Calendar.MONTH, 11);
                    calBegin.set(Calendar.DAY_OF_MONTH, 31);
                } else if (beginWeek == 1) {
                    // 第一周是1月1号开始
                    calBegin.set(Calendar.MONTH, 0);
                    calBegin.set(Calendar.DAY_OF_MONTH, 1);
                } else {
                    // 如果不是开始周和结束周就这么干
                    calBegin.set(Calendar.WEEK_OF_YEAR, beginWeek);
                }
                if (endWeek == 53) {// 最后一周是12月31号结束
                    calEnd.set(Calendar.MONTH, 11);
                    calEnd.set(Calendar.DAY_OF_MONTH, 31);
                } else if (endWeek == 1) {
                    // 第一周是1月1号开始
                    calEnd.set(Calendar.MONTH, 0);
                    calEnd.set(Calendar.DAY_OF_MONTH, 1);
                } else {
                    // 如果不是开始周和结束周就这么干
                    calEnd.set(Calendar.WEEK_OF_YEAR, endWeek);
                }
                //得到起始周的周一   和结束周的周末
                map.put(beginkey, getWeekStartAndEnd(0,sdf.format(calBegin.getTime())));
                map.put(endkey, getWeekStartAndEnd(1,sdf.format(calEnd.getTime())));
            }
            
          } catch (ParseException e) {
              e.printStackTrace();
          }
        return map;
        
    }
    
    
    
    /**
     * (周)返回起止时间内的所有自然周
     * @param begin  时间起
     * @param end   时间止
     * @param startw  周起
     * @param endW    周止
     * (标记)此方法无问题
     * @return
     */
    public static List<String> getWeeksList(String begin,String end){
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
         List<String> lDate = new ArrayList<String>();
          Date date1 = null; // 开始日期
          Date dEnd = null; // 结束日期
          try {
            date1 = sdf.parse(begin);
            dEnd = sdf.parse(end);
            Calendar calBegin = Calendar.getInstance();
            // 使用给定的 Date 设置此 Calendar 的时间
            calBegin.setTime(date1);
            Calendar calEnd = Calendar.getInstance();
            // 使用给定的 Date 设置此 Calendar 的时间
            calEnd.setTime(dEnd);
            //开始时间是今年的第几周
            //添加第一个周
            int beginww = getDateOfWeek(begin);
            int endww = getDateOfWeek(end);
            
            int beginY = calBegin.get(Calendar.YEAR);
            int endY = calEnd.get(Calendar.YEAR);
            
            int weekall = getAllWeeks(beginY+"");//开始日期总共有多少周
            //如果是同一年
            do{
                lDate.add(beginY+"年第"+beginww+"周");
                if(beginww==weekall){
                    beginww = 0;
                    beginY++;
                    weekall = getAllWeeks(beginY+"");
                }
                if(beginY==endY &&beginww==endww){
                    break;
                }
                beginww++;
            }while(beginY<=endY);
          } catch (ParseException e) {
              e.printStackTrace();
          }
         return lDate;
    }

    /**
     * 获取两个日期段相差的周数
     * (标记)(此方法没有问题)
     */
    public static int getWeekCount(String date1,String dEnd){
         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar c_begin = Calendar.getInstance();
        Calendar c_end = Calendar.getInstance();
        try {
            c_begin.setTime(sdf.parse(date1));
            c_end.setTime(sdf.parse(dEnd));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        int count = 1;
        c_begin.setFirstDayOfWeek(Calendar.MONDAY);
        c_end.setFirstDayOfWeek(Calendar.MONDAY);
        c_begin.setMinimalDaysInFirstWeek(1);
        c_end.setMinimalDaysInFirstWeek(1);
        //
        int beginy = c_begin.get(Calendar.YEAR);
        int endy = c_end.get(Calendar.YEAR);
        
        int beginw = getDateOfWeek(date1);//获取当前所在的周
        int endw = getDateOfWeek(dEnd);//获取当前所在的周
        int beginSumWeek = getAllWeeks(String.valueOf(beginy));
        
        count = (endy-beginy)*beginSumWeek+(endw-beginw)+1;
        
        return count;
    }
    
    /**
     * 返回该年有多少个自然周
     * @param year   最多53  一般52
     * 如果12月月末今天在本年53周(属于第二年第一周) 那么按照当年53周算 哪怕只有1天
     * @return
     */
    public static int getAllWeeks(String year){
          Calendar calendar = Calendar.getInstance();
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
          try {
            calendar.setTime(sdf.parse(year+"-12-31"));
          } catch (ParseException e) {
            e.printStackTrace();
          }
          calendar.setFirstDayOfWeek(Calendar.MONDAY);// 周的第一天为周一
          calendar.setMinimalDaysInFirstWeek(1);
          
          
          int week =  calendar.get(Calendar.WEEK_OF_YEAR);
          if(week==1){
              week = 53;
          }
//          if(week != 53){
//             week = 52;
//          }
          return week;
    }
    
    /**
     * 根据周 返回日期所在周的第一天或最后一天
     * type:0 第一天    type:1最后一天
     * (标记)此方法经过测试 符合本次要求
     */
    public static String getWeekStartAndEnd(int type,String startDate){
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        Date date1 = null; // 日期
        try {
            date1 = df.parse(startDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        Calendar c1 = Calendar.getInstance();
        c1.setTime(date1);
        c1.setFirstDayOfWeek(Calendar.MONDAY);// 周的第一天为周一
        c1.setMinimalDaysInFirstWeek(1);
        // 去年的开始的本周
//        c1.set(Calendar.WEEK_OF_YEAR, Integer.parseInt(startWeek));
        if(type==0){
            // 得到起始周的周一 和结束周的周末        考虑跨年情况
            int day_of_week = c1.get(Calendar.DAY_OF_WEEK)-1;
            int year = c1.get(Calendar.YEAR);
            if (day_of_week == 0)
                day_of_week = 7;
            c1.add(Calendar.DATE, -day_of_week+1);
            int newy = c1.get(Calendar.YEAR);//如果往前推  年发生变化  那么是存在跨年情况  设置本周起始为1月1号
            if(year!=newy){
                //存在跨年
                c1.set(year, 0, 1);
            }
        }else if(type==1){
            // 本周周末
            int day_of_week_end = c1.get(Calendar.DAY_OF_WEEK) - 1;
            int year = c1.get(Calendar.YEAR);
            if (day_of_week_end == 0)
                day_of_week_end = 7;
            c1.add(Calendar.DATE, -day_of_week_end + 7);
            int newy = c1.get(Calendar.YEAR);//如果往前推  年发生变化  那么是存在跨年情况  设置本周起始为1月1号
            if(year!=newy){
                //存在跨年
                c1.set(year, 11, 31);
            }
        }
        return df.format(c1.getTime());
    }
    
    /**
     * 获取当前日期为第几周
     * 次方法经过每年1号  12月28  30好测试 暂无问题  (标记)
     * @param date
     * @return
     */
    public static int getDateOfWeek(String date){
         Calendar calendar = Calendar.getInstance();
          SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
          try {
            calendar.setTime(sdf.parse(date));
          } catch (ParseException e) {
            e.printStackTrace();
          }
          calendar.setFirstDayOfWeek(Calendar.MONDAY);// 周的第一天为周一
          calendar.setMinimalDaysInFirstWeek(1);//第一周最少1天
          int count = calendar.get(Calendar.WEEK_OF_YEAR);//得到其实日期的周
          //获取月
          int month = calendar.get(Calendar.MONTH)+1;
          //如果是12月
          if(month==12&&count==1){
              return 53;
          }
        return count;
    }
    
    
    
    public static void main(String[] args) throws Exception{
          //获取本周的第一天
//          System.out.println(getWeekStartAndEnd(1,"2014-12-30"));
        
//        System.out.println("两个时间相差:"+getWeekCount("2014-12-29","2015-01-05")+"周");
        
        //测试两个时间内的所有的周
//        System.out.println(getWeeksList("2014-12-29","2015-01-05"));
        
        
//        System.out.println(getWeekDate(1,"s","e","2014-5-20","2014-06-10"));
          
        System.out.println(getDateOfWeek("2012-12-24"));
          
        //测试当天在本年度的第几天
//        System.out.println("2014-01-01:"+getDateOfWeek("2014-12-28"));
//        System.out.println("2015-01-01:"+getDateOfWeek("2015-12-28"));
//        System.out.println("2016-01-01:"+getDateOfWeek("2016-12-28"));
//        System.out.println("2017-01-01:"+getDateOfWeek("2017-12-28"));
//        System.out.println("2018-01-01:"+getDateOfWeek("2018-12-28"));
//        System.out.println("2019-01-01:"+getDateOfWeek("2019-12-28"));
//        System.out.println("2020-01-01:"+getDateOfWeek("2020-12-28"));
//        System.out.println("2021-01-01:"+getDateOfWeek("2021-12-28"));
//        System.out.println("2022-01-01:"+getDateOfWeek("2022-12-28"));
//        System.out.println("2023-01-01:"+getDateOfWeek("2023-12-28"));
//        System.out.println("2024-01-01:"+getDateOfWeek("2024-12-28"));
//        System.out.println("2025-01-01:"+getDateOfWeek("2025-12-28"));
//        System.out.println("2026-01-01:"+getDateOfWeek("2026-12-28"));
//        System.out.println("2027-01-01:"+getDateOfWeek("2027-12-28"));
//        System.out.println("2028-01-01:"+getDateOfWeek("2028-12-28"));
     }
    
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值