java时间计算同比环比周的问题

问题描述:

在业务中会有传不同日期格式,

1、有天(2020-02-29),周(2020-03第三周),月(2020-02二月份),

2、同时需要计算对应的去年同比时间和环比(就是上一个时间段,周的2020-03环比就是2020-04)时间,

3、同时还要获取周和月的开始时间和结束时间,比如周2020-02的开始是2020-01-06,结束时间是2020-01-12,

4、周的第一天从周一开始算,周跨年有大于等于四天在今年就算今年最后一周,否则就是明年的第一周

最麻烦的就是查询周的同比和环比问题,因为涉及跨年和周一是第一天的特殊情况,最后在摸索了一天后学会了java的Calendar工具怎么用了,直接上通用方法。

下面这个方法是获取同比环比周的第一天日期,第二个方法是把这个日期转换成周格式(xxxx-xx)

    /**
     * 同比环比周, xxxx-xx,
     * @param date 格式必须是xxxx-xx
     * @param type 0是当前
     *             1是同比
     *             2是环比
     */
    public static Date getCompareWeek(String date, int type) {
        int year = Integer.parseInt(date.substring(0, 4));
        int week = Integer.parseInt(date.substring(5, 7));

        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.setMinimalDaysInFirstWeek(4);
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.WEEK_OF_YEAR, week);
        int plus;
        if (type == 1)
            if (week == 53)
                plus = cal.getWeeksInWeekYear();
            else
                plus = 52;
        else if (type == 2)
            plus = 1;
        else
            plus = 0;
        cal.add(Calendar.WEEK_OF_YEAR, -plus);

        return cal.getTime();
    }

备注:3月21号修改,之前有个bug,因为calendar在判断周的日期的时候会根据当前时间的周时间变化,例如今天周五,同比去年的第五周就会到去年第五周的周五,同理如果是今天是周一也就会到去年第五周的周一,这样有可能会有问题了。具体还是自己试验一下会更清楚一些。例如2021-01的同比和环比周问题

    /**
     * 一周最少四天,每周从周一开始是第一天,获取周格式日期  xxxx-xx
     * @return xxxx-xx
     * @throws ParseException
     */

    public static String getCurrentWeekWithYearStartWithMonday(Date dateDesc) {
        Calendar c = Calendar.getInstance();
        c.setTime(dateDesc);
        c.setFirstDayOfWeek(Calendar.MONDAY);
        c.setMinimalDaysInFirstWeek(4);
        Date time = c.getTime();
        int day = c.get(Calendar.DAY_OF_MONTH);
        int week = c.get(Calendar.WEEK_OF_YEAR);
        int year = c.get(Calendar.YEAR);
        if (day > 28 && week == 1) {
            year++;
        } else if (day < 4 && week == getWeeksOfYear(dateDesc)){
            year--;
        }
        return String.format("%04d-%02d", year, week);
    }

    public static int getWeeksOfYear(int year) {
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.setMinimalDaysInFirstWeek(4);
        cal.set(Calendar.YEAR, year);
        return cal.getWeeksInWeekYear();
    }
    public static int getWeeksOfYear(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.setMinimalDaysInFirstWeek(4);
        cal.setTime(date);
        return cal.getWeeksInWeekYear();
    }

这个是中国标准的日历星期说明,所有定义都是从这里来的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值