java 把同一天的签到数据放在一起,获取每天的时间差累加

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuforeverlove/article/details/81981786

 有这样一个需求:用户签到,每天可以签到多次,获取每天签到的最开始和最晚的时间,得到当天的时间差,然后获取这段时间的总共签到时长。

package com.xxx.controller;
import com.xxx.utils.DateUtil;
import java.text.SimpleDateFormat;
import java.util.*;

public class TestDate2 {
    public static void main(String[] args) {
        Map<String ,List<Long>> map = new HashMap<String ,List<Long>>();
        List<String> set = new ArrayList<String>();
        List<Long> longlist = new ArrayList<Long>();
        longlist.add(1533719097L);
        longlist.add(1533719149L);
        longlist.add(1533632799L);
        longlist.add(1533728193L);
        longlist.add(1533639930L);
        longlist.add(1533553530L);
        longlist.add(1533524730L);
        longlist.add(1533720993L);
        longlist.add(1533720993L);
        longlist.add(1533695793L);
        for (Long signTime : longlist) {
            String s = DateUtil.timeStamp2Date(signTime.toString(), "yyyy-MM-dd");
            if(map.containsKey(s)){
                map.get(s).add(signTime);
            } else {
                ArrayList<Long> temp = new ArrayList();
                temp.add(signTime);
                map.put(s, temp);
            }
        }
        for (Map.Entry<String, List<Long>> entry : map.entrySet()) {
            //map的key
            set.add(entry.getKey());
        }
        Long totaltime = 0L;
        //map的key排序 最早时间在前面
        Collections.sort(set);
        for (String s : set) {
            System.out.println("map的key值为:"+s);
            List<Long> longs = map.get(s);
            if (!CollectionUtils.isEmpty(longs) && longs.size() > 1) {
                Collections.sort(longs);
                Long start = longs.get(0);
                Long end = longs.get(longs.size() - 1);
                Long total = end - start; 
                if (total .toString().contains("-"))  total = 0L;
                totaltime += total;
                System.out.println("同一天时长:"+total);
            }
        }
        System.out.println("总时长:"+totaltime);
    }



//日期工具类

package com.xxx.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.*;


public class DateUtil {
    private static final Logger logger = LoggerFactory.getLogger(DateUtil.class);
    private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal();
    private static final Object object = new Object();

    public DateUtil() {
    }

    public static String DateToString(Date date, String pattern) {
        String dateString = null;
        if(date != null) {
            try {
                dateString = getDateFormat(pattern).format(date);
            } catch (Exception var4) {
                logger.debug("将日期转化为日期字符串失败!", var4);
            }
        }

        return dateString;
    }

    /**
     * 时间戳转日期
     *
     * @param seconds
     * @param format
     * @return
     */
    public static String timeStamp2Date(String seconds,String format) {
        if(seconds == null || seconds.isEmpty() || seconds.equals("null")){
            return "";
        }
        if(format == null || format.isEmpty()){
            format = "yyyy.MM.dd HH:mm";
        }
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(new Date(Long.valueOf(seconds+"000")));
    }




}

附上实际开发需要的代码:实际开发签到时间分为开始签到时间和结束签到时间,若当天只有开始签到时间,则当天总时长为0;若当天只有结束签到时间,当天总时长也为0;若当天最晚的结束签到时间都早于开始签到时间,则当天总时长也为0。

/**
     * 获取全部的签到记录
     * 最新的需求
     */
    @Override
    public void modifyStafferInfoTime() {
        //获取未培训过的全部家政人员
        List<HkStafferInfo> allStafferInfos = hkStafferInfoMapper.getAllStafferInfos();
        //获取全部的签到记录
        List<HkSignInfo> hkSignInfos = hkSignInfoMapper.selectAllSignInfo();

        //此家政人员下的全部签到记录时间
        List<Long> longlist = new ArrayList<>();

        //开始签到集合
        List<Long> startime = new ArrayList<>();
        //结束签到集合
        List<Long> endtime = new ArrayList<>();

        //此家政人员下的全部签到记录时间
        List<SignDTO> signDTO = new ArrayList<>();

        for (HkStafferInfo sta : allStafferInfos) {
            HkStafferInfo hkStaffer = new HkStafferInfo();
            //家政人员id
            Long stuId = sta.getId();
            //总时长(单位:秒)
            //Long lengthTime = sta.getLengthTime();
            //此家政人员的全部签到记录时间
            for (HkSignInfo sign : hkSignInfos) {
                if (stuId.longValue() ==  sign.getStudentId().longValue()) {
                    longlist.add(sign.getSignBeginTime());
                    SignDTO s = new SignDTO();
                    s.setSignBeginTime(sign.getSignBeginTime());
                    s.setSignState(sign.getSignState());
                    signDTO.add(s);
                }
            }

            //把相同日期的数据进行分组(包含签到开始和结束时间)
            Map<String,List<SignDTO>> map = new HashMap<>();
            for (SignDTO signTime : signDTO) {
                //签到时间(包含签到开始和结束时间)
                Long signDate = signTime.getSignBeginTime();
                String s = DateUtil.timeStamp2Date(signDate.toString(), "yyyy-MM-dd");
                if(map.containsKey(s)){
                    map.get(s).add(signTime);
                } else {
                    ArrayList<SignDTO> temp = new ArrayList();
                    temp.add(signTime);
                    map.put(s, temp);
                }
            }

            //map的key
            List<String> set = new ArrayList<>();
            for (Map.Entry<String, List<SignDTO>> entry : map.entrySet()) {
                set.add(entry.getKey());
            }
            Long totaltime = 0L;
            ////把map的key值排序(日期从早到晚)
            Collections.sort(set);
            for (String s : set) {
                log.info(this.getClass().getName()+"==>map的key值为:"+s);
                //获取同一天的签到数据(包含签到开始和结束时间)
                List<SignDTO> longs = map.get(s);
                if (!CollectionUtils.isEmpty(longs)) {
                    //把同一天的签到时间分为开始和结束签到时间
                    for (SignDTO signTime : longs) {
                        //签到时间(签到开始时间或者签到结束时间)
                        Long signBeginTime = signTime.getSignBeginTime();
                        //0:表示签到开始时间 1:签到结束时间
                        if (signTime.getSignState() == 0) {
                            //标识为0的放在集合里
                            startime.add(signBeginTime);
                        } else {
                            //标识为1的放在集合里
                            endtime.add(signBeginTime);
                        }
                    }
                }

                //签到开始集合和签到结束集合都不为空
                if (!CollectionUtils.isEmpty(startime) && !CollectionUtils.isEmpty(endtime)) {
                    Collections.sort(startime);
                    Collections.sort(endtime);
                    //大于0,说明当天有开始和结束签到时间
                    if (endtime.size() > 0 && startime.size() > 0) {
                        //当天的最开始时间(单位:秒)
                        Long begintime = startime.get(0);
                        //当天的最后签到时间
                        Long currenEndtime = endtime.get(endtime.size() - 1);
                        //当天的签到时间长(单位:秒)
                        Long differtime = currenEndtime - begintime;
                        if (differtime.toString().contains("-"))  differtime = 0L;
                        //加起来的总时长
                        totaltime += differtime;
                    }

                }
            }

            log.info(this.getClass().getName()+"==>总时长(秒):"+totaltime);
            //每次都是修改学时,不累加之前存在的学时,因为这是每次都是把学员的全部签到记录都查出来了,然后再累加学时。
            //加起来的时长大于等于16学时
            if (totaltime.longValue() >= AppConstants.LENGTH_TIME) {
                //家政人员id
                hkStaffer.setId(stuId);
                //是否完成培训 0未完成 1完成
                hkStaffer.setTrainState(AppConstants.TRAIN);
                //16学时
                hkStaffer.setLengthTime(AppConstants.LENGTH_TIME);
                int i = hkStafferInfoMapper.updateStaffInfo(hkStaffer);
                log.debug(this.getClass().getName()+"==>createStafferTime方法 ==>修改结果:"+ (i == 0 ? "失败" : "成功"));
            }else {
                //家政人员id
                hkStaffer.setId(stuId);
                //是否完成培训 0未完成 1完成
                hkStaffer.setTrainState(AppConstants.NOT_TRAIN);
                //学习的总共的学时
                hkStaffer.setLengthTime(totaltime);
                int i = hkStafferInfoMapper.updateStaffInfo(hkStaffer);
                log.debug(this.getClass().getName()+"==>createStafferTime方法 ==>修改结果:"+ (i == 0 ? "失败" : "成功"));
            }
        }
    }

猜你喜欢

转载自blog.csdn.net/xuforeverlove/article/details/81981786