统计连续签到的方法

  /**
     * 从最后一次签到时间反推连续签到天数
     * 
     * @param list
     *            List<Date>
     * @param asc
     *            boolean (true:ASC,false:DESC) 对list的描述,是升序还是降序
     * @return
     * 
     * */
    public static Map<String, Object> calcuContinue(List<Date> list, boolean asc) {
        Date end = new Date();
        Date start = new Date();
        Calendar cBefore = Calendar.getInstance();
        Calendar cAfter = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        Map<String, Object> result = new HashMap<String, Object>();

        List<Date> dateList = new ArrayList<Date>();
        if (asc == true) {
            dateList.addAll(list);
        } else {
            for (int i = list.size() - 1; i > -1; i--)
                dateList.add(list.get(i));
        }

        int size = dateList.size();
        if (size > 0) {
            end = dateList.get(size - 1);
        }
        for (int i = size - 1; i > -1; i--) {
            if (size == 1) {
                end = start = dateList.get(0);
                break;
            }
            if (i - 1 == -1) {
                break;
            }
            cBefore.setTime(dateList.get(i - 1));
            cAfter.setTime(dateList.get(i));

            if (daysBetween(cBefore.getTime(), cAfter.getTime()) == 1) {
                start = cBefore.getTime();
            } else {
                start = cAfter.getTime();
                break;
            }
        }

        result.put("start", sdf.format(start));
        result.put("end", sdf.format(end));
        result.put("continueDays", daysBetween(start, end) + 1);
        return result;
    }

    /**
     * 计算两个日期之间相差的天数,忽略时分秒 例如:2014年12月31日 与 2015年1月1日 相差1天
     * 
     * @param before
     * @param after
     * @return 间隔天数
     */
    private static int daysBetween(Date before, Date after) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        try {
            before = sdf.parse(sdf.format(before));
            after = sdf.parse(sdf.format(after));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        long days_long = (after.getTime() - before.getTime())
                / (1000 * 60 * 60 * 24);
        return Integer.parseInt(String.valueOf(days_long));
    }

示例:

    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        List<Date> list = new ArrayList<Date>();

        list.add(sdf.parse("20141229"));
//        list.add(sdf.parse("20141230"));
        list.add(sdf.parse("20141231"));
        list.add(sdf.parse("20150101"));

        System.out.println(calcuContinue(list, false));

    }

结果:

{start=20141231, continueDays=2, end=20150101}
原文地址:https://www.cnblogs.com/zno2/p/4718075.html