zoukankan      html  css  js  c++  java
  • 走势图通用写法

    需求:

    天走势图,周走势图,月走势图

    天走势图需要每十分钟(或者其他时间间隔)。周走势图和月走势图为一天。时间和数据对应,并且需要排序。

    需要数据:

    天走势图的原始数据每五分钟存在一次数据。(或者其他时间间隔)

    周以上的走势图按照每天聚合一次数据。

    使用数据库:

    mongodb

    做法:

    先生成排好序的hashmap。

    //sn天hash
        private ImmutableSortedMap<Long, Flow> generateDayHash(Date startDate, Date endDate, String sn) {
            Builder<Long, Flow> builder = ImmutableSortedMap.naturalOrder();
            Long start = startDate.getTime();
            Long end = endDate.getTime();
            Date nextHour = DateUtil.calHour2DateStandard(startDate, 1);
            Long next = nextHour.getTime();
    
            for(Long l = next; l > start; l = l - HOUR_AGGREGATION_TIME) {
                Flow flowlog = new Flow();
                Date date = new Date(l);
                String dateString = DateUtil.date2String("yyyy-MM-dd HH:mm:ss", date);
                flowlog.setTimeString(dateString);
                flowlog.setSn(sn);
                flowlog.setRxBytes(0l);
                builder.put(l, flowlog);
            }
            ImmutableSortedMap<Long, Flow> map = builder.build();
            for(Long l = next; l < end; l = l + HOUR_AGGREGATION_TIME) {
                if(!map.containsKey(l)) {
                    Flow flowlog = new Flow();
                    Date date = new Date(l);
                    String dateString = DateUtil.date2String("yyyy-MM-dd HH:mm:ss", date);
                    flowlog.setTimeString(dateString);
                    flowlog.setSn(sn);
                    flowlog.setRxBytes(0l);
                    builder.put(l, flowlog);
                }
            }
            map = builder.build();
            return map;
        }

    获取最接近的时间整数

    //取得最近的整数时间,10分钟间隔。例如12:26则为12:30。
        private Long getAggregatedTime(String time) {
            String[] tmp = time.split(":");
            int i = Integer.parseInt(tmp[1].substring(0,1)) + 1; //调整这个1,可以调整到20分钟间隔,30分钟间隔等
            String dateString = tmp[0] + ":" + i + "0:00";
            SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            try {
                return sdf.parse(dateString).getTime();
            } catch (ParseException e) {
                LOGGER.error("failed to execute method getAggregatedTime in flowService {}", e);
            }
            
            return 0l;
        }

    返回天走势图

    //返回sn天走势图-间隔10分钟
        public List<Flow> getDayFlowBySn(Date startDate, Date endDate, String sn, String type) {
            List<Flow> result = new ArrayList<>();
            List<Flowlog> list = new ArrayList<>();
            if(!legalParam(startDate, endDate))
                return result;
            Long start = startDate.getTime();
            Long end = endDate.getTime();
            try {
                list = mongo.find(new Query(Criteria
                        .where(FlowlogField.START)
                        .gte(start).lte(end).and(FlowlogField.SN).is(sn).and(FlowlogField.INTF_TYPE).is(type))
                        , Flowlog.class
                        );
                ImmutableSortedMap<Long, Flow> map = generateDayHash(startDate, endDate, sn);
                result = getDayFlow(list, map);
                return result;
            } catch (Exception e) {
                LOGGER.error("execute method getDayFlowBySn failed {}", e);
                return result;
            }
        }
  • 相关阅读:
    多帐套,多组织 登录系统设计
    Git常用命令速查05
    一步步搭建java信息管理系统00
    Git常用命令速查04
    Git常用命令速查03
    Git常用命令速查02
    Git常用命令速查01
    无法创建k/3中间层组件或组件正在调用中间层问题解决
    jQuery.i18n.properties实现前端国际化
    ORACLE telnet 1521 不通及ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务的解决
  • 原文地址:https://www.cnblogs.com/guochunyi/p/5445499.html
Copyright © 2011-2022 走看看