版权声明:本文为博主原创文章,未经博主允许不得转载。 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 ? "失败" : "成功"));
}
}
}