根据第几周、第几月获取时间段

1. 根据当前年的第几周,获取日期时间段(已解决跨年问题)

2. 根据当前年的第几月,获取日期时间段

3. 根据年份,获取日期时间段(如果当前日期处于当前年中,则结束日期取当前日期)

4. 获取指定日期在指定年的第几周(已解决跨年问题)


提示:这里描述项目中遇到的问题:

  1. 根据当前年的第几周,获取日期时间段(已解决跨年问题)
public static void main(String[] args) {
        // 202252表示2022年的第52周
        String timeInterval = getTimeIntervalByWeekNo("202252");
        System.out.println(timeInterval);
    }

    /**
     * 根据当前年的周数,获取日期时间段
     *
     * @param time
     * @return
     */
    private static String getTimeIntervalByWeekNo(String time) {
        int year = Integer.parseInt(time.substring(0, 4));
        int week = Integer.parseInt(time.substring(4, 6));

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.WEEK_OF_YEAR, week);
        cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
        // 解决跨年问题,如果每年得第一天不是星期一,并且第一个星期一之前的天数不足4天,则每年的第一周从当年的第一个星期一开始算,星期一之前的统计在上一年
        if (getFirstDayWeekDay(year) != 2 && Integer.parseInt(getFirstMondayByYear(time)) - Integer.parseInt(time + "0101") <= 3) {
            cal.add(Calendar.DAY_OF_WEEK, 7);
        }
        String beginDate = sdf.format(cal.getTime());
        cal.add(Calendar.DAY_OF_WEEK, 6);
        String endDate = sdf.format(cal.getTime());
        int currentDateNum = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
        int endDateNum = Integer.parseInt(endDate.replace("-", ""));
        // 如果每周结束日期比今日大,并且不超过7天,则最后一日取今天
        if (endDateNum - currentDateNum > 0 && endDateNum - currentDateNum < 7) {
            return beginDate + "~" + sdf.format(new Date());
        }
        return beginDate + "~" + endDate;
    }

    /**
     * 获取每年第一天是星期几
     *
     * @param year
     * @return
     */
    private static int getFirstDayWeekDay(int year) {
        Calendar cal = Calendar.getInstance();
        cal.set(year, 0, 1);
        return cal.get(Calendar.DAY_OF_WEEK);
    }

执行结果:
在这里插入图片描述
2. 根据当前年的第几月,获取日期时间段

 	public static void main(String[] args) {
        String timeInterval = getTimeIntervalByMonthNo("2023-08");
        System.out.println(timeInterval);
    }

    /**
     * 获取月份时间段
     *
     * @param time
     * @return
     */
    private static String getTimeIntervalByMonthNo(String time) {
        String beginDate = time + "-01";

        String year = time.split("-")[0];
        String month = time.split("-")[1];
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.YEAR, Integer.parseInt(year));
        //Calendar里的月是从0开始,要-1
        cal.set(Calendar.MONTH, Integer.parseInt(month) - 1);
        //日,设为一号
        cal.set(Calendar.DATE, 1);
        //月份加一,得到下个月的一号
        cal.add(Calendar.MONTH, 1);
        //下一个月减一为本月最后一天
        cal.add(Calendar.DATE, -1);
        //获得月末是几号
        String monthEnd = String.valueOf(cal.get(Calendar.DAY_OF_MONTH));
        String endDate = time + "-" + monthEnd;
        int currentDateNum = Integer.parseInt(new SimpleDateFormat("yyyyMMdd").format(new Date()));
        int endDateNum = Integer.parseInt(endDate.replace("-", ""));
        if (endDateNum - currentDateNum > 0 && endDateNum - currentDateNum < Integer.parseInt(monthEnd)) {
            return beginDate + "~" + new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        }
        return beginDate + "~" + endDate;
    }

执行结果:
在这里插入图片描述
3. 根据年份,获取日期时间段(如果当前日期处于当前年中,则结束日期取当前日期)

public static void main(String[] args) {
        String timeInterval = getTimeIntervalByYearNo("2023-08");
        System.out.println(timeInterval);
    }

    /**
     * 获取年份时间段
     *
     * @param time
     * @return
     */
    private static String getTimeIntervalByYearNo(String time) {
        String beginDate = time + "-01-01";
        String endDate = time + "-12-31";
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        int currentYearNum = Integer.parseInt(sdf.format(new Date()));
        int endDateNumber = Integer.parseInt(endDate.replace("-", ""));
        if (endDateNumber - currentYearNum > 0) {
            return beginDate + "~" + new SimpleDateFormat("yyyy-MM-dd").format(new Date());
        }
        return beginDate + "~" + endDate;
    }

执行结果:
在这里插入图片描述
4. 获取指定日期在指定年的第几周(已解决跨年问题)

public static void main(String[] args) {
        String timeInterval = getWeekOfYear("2023-01-01");
        System.out.println(timeInterval);
    }

    /**
     * 获取指定日期在指定年的第几周
     *
     * @param createTime
     * @return
     * @throws ParseException
     */
    private static String getWeekOfYear(String createTime) {
        try {
            Calendar calendar = Calendar.getInstance();
            //设置星期一为一周开始的第一天
            calendar.setFirstDayOfWeek(Calendar.MONDAY);
            calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(createTime));
            calendar.setMinimalDaysInFirstWeek(7);
            //获得当前日期属于今年的第几周
            int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
            // 解决跨年问题,年初不足7天的,且第一个星期一之前的天数不足4天,当前日期比第一个星期一小,算上一年的最后一周;一个星期一之前的天数超过4天,当前日期比第一个星期一小,算今年的第一周
            if (createTime.compareTo(getFirstMonday(createTime)) < 0 && Integer.parseInt(getFirstMonday(createTime).replace("-","")) - Integer.parseInt(getYear(createTime) + "0101") <= 3) {
                calendar.add(Calendar.DATE, -7);
                weekOfYear = weekOfYear + 1;
            } else if (Integer.parseInt(getFirstMonday(createTime).replace("-","")) - Integer.parseInt(getYear(createTime) + "0101") > 3) {
                calendar.add(Calendar.DATE, 7);
                weekOfYear = 1;
            }
            int year = calendar.get(Calendar.YEAR);
            return year + String.format("%02d", weekOfYear);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 获取当前年第一个星期一的日期
     *
     * @param createTime
     * @return
     * @throws ParseException
     */
    private static String getFirstMonday(String createTime) throws ParseException {
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(createTime));
        while (calendar.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) {
            // 循环直到找到第一个星期一
            calendar.add(Calendar.DAY_OF_MONTH, 1);
        }

        return new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime());
    }

执行结果:
202252表示2022年的第52周
在这里插入图片描述

代码做了跨年处理,在年初第一个星期一之前的日期,算上一年的最后一周,在第一个星期一之后的日期,算当年的第一周
在这里插入图片描述

希望能够帮助到大家,欢迎评论(●’◡’●)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值