获取一个月中第几个周的第几天的具体日期

数据

    /**
     * 节日是某月的第几个星期几
     * 例如:0637  父亲节 06是6月,3是第三个星期, 7是星期日。0351其中1是星期一
     * 注意:如果是最后一个星期天,表示为-17,-1是星期数,7是星期日
     */
    private static String[] wFtv = new String[]{
            "黑人节 0117",
            "世界麻风日 01-17",
            "日本成人节 0121",
            "中小学安全教育日 0351",
            "母亲节 0527",
            "全国助残日 0537",
            "父亲节 0637",
            "合作节 0716",
            "被奴役国家周 0737",
            "国际聋人节 0947",
            "国际住房日 1011 ",
            "感恩节 1144"};

思路:

本周几【从星期天开始计算】,如果今天星期二,那么返回 那么周天就是1,周六就是7

A:当前日期是周几,周二就返回2,周天就返回7

  • A = (instance.get(Calendar.DAY_OF_WEEK)-1);  if (A== 0) A= 7;//由于java的DAY_OF_WEEK是从周天开始算的,周天是1,周六是7,所以等于周天的时候调整值

B=要求的日期时周几,例如“母亲节 0527”中的0,0代表星期天;B=0,例如”国际和平日 0932“中的2,2代表星期2;

如果是求本月的第几周的星期几:

C=A-B。

第一步:求出两个日期之间星期的距离

如果C>0 ,假如A是周五,B是周三,表示他们俩之间的距离是(7-A)+B

如果C<0 ,假如A是周三,B是周五,表示他们俩之间的距离是B-A

第二步:加上第几个星期的天数,设置

   给月初的日期加上:【C+7*(第几个星期数-1)】

如果是求本月的倒数第几周的星期几:

C=A-B。

第一步:求出两个日期之间星期的距离

如果C>0 ,假如A是周五,B是周三,表示他们俩之间的距离是B-A

如果C<0 ,假如A是周三,B是周五,表示他们俩之间的距离是(7-B)+A

第二步:加上第几个星期的天数,设置

   给月末的日期减去:【C+7*(第几个星期数-1)】

 代码:

        Map<String, String> wFtvMap = Arrays.stream(wFtv).collect(Collectors.toMap(k -> k.split(" ")[0], k -> k.split(" ")[1]));
        String dateNum = "";
        if(wFtvMap.containsKey(input)){
            System.out.println(getDayInWeek(wFtvMap.get(input)));
        }

    /**
     * 获取一个月中第几个周的第几天
     */
    private static String getDayInWeek(String dateNum){
        int month = Integer.valueOf(dateNum.substring(0,2));
        int order = Integer.valueOf(dateNum.substring(2,dateNum.length()-1));
        int weekNum = Integer.valueOf(dateNum.substring(dateNum.length()-1,dateNum.length()));

        //设置月份:注意,设置月份的时候,设置如果是2,实际是3月份
        instance.set(instance.get(Calendar.YEAR),month-1,instance.get(Calendar.DATE));

        int distance = 0;
        if(order>0 && order<6){//第几个星期
            instance.set(Calendar.DAY_OF_MONTH, 1);
            int whatWeekNow = (instance.get(Calendar.DAY_OF_WEEK)-1);
            if (whatWeekNow == 0)  whatWeekNow = 7;//由于java的DAY_OF_WEEK是从周天开始算的,周天是1,周六是7,所以等于周天的时候调整值
            int diff = whatWeekNow-weekNum;//月初处于本月第几周-设置的日期是周几
            if(diff>0){
                distance = 7-whatWeekNow+weekNum;
            }else if(diff<0){
                distance = weekNum - whatWeekNow;
            }
            instance.add(Calendar.DAY_OF_MONTH,distance+(order-1)*7);
        }else if (order<0){//获取倒数第几个星期
            instance.add(Calendar.MONTH, 1);
            instance.set(Calendar.DAY_OF_MONTH, 1);
            instance.add(Calendar.DAY_OF_MONTH, -1);//本月最后一天
            int whatWeekNow = (instance.get(Calendar.DAY_OF_WEEK)-1);
            if (whatWeekNow == 0)  whatWeekNow = 7;//由于java的DAY_OF_WEEK是从周天开始算的,周天是1,周六是7,所以等于周天的时候调整值
            int diff = whatWeekNow-weekNum;//月末处于本月第几周-设置的日期是周几
            if(diff>0){
                distance = weekNum-whatWeekNow;
            }else{
                distance = (7-weekNum)+whatWeekNow;
            }
            instance.add(Calendar.DAY_OF_MONTH,-distance+(order+1)*7);
        }else{
            throw new StringIndexOutOfBoundsException("当月的星期数不能大于5");
        }

        return sdf.format(instance.getTime());
    }

    public static void main(String[] args) {
        System.err.println(getDayInWeek("06-17"));//2021-06-27
        System.err.println(getDayInWeek("0521"));//2021-05-10
        System.err.println(getDayInWeek("04-36"));//2021-04-10
        System.err.println(getDayInWeek("0534"));//2021-05-20

    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值