zoukankan      html  css  js  c++  java
  • 统计连续签到的方法

      /**
         * 从最后一次签到时间反推连续签到天数
         * 
         * @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}
  • 相关阅读:
    微服务搭建说明(三)
    Bootstrap框架--DataTables列表示例--添加判断
    使用bootstrap-select 动态从后台加载下拉选项
    安全整改相关内容
    tomcat禁用PUT,DELETE等一些不必要的HTTP方法
    在Java web项目中防止用户注销后使用浏览器中的“后退”按钮返回注销前页面
    Tomcat修改最大连接数及查看最大连接数
    informix错误代码小结
    HTTP协议详解
    informix创建同义词
  • 原文地址:https://www.cnblogs.com/zno2/p/4718075.html
Copyright © 2011-2022 走看看