初始化代码

This commit is contained in:
黄志军
2021-10-26 19:20:52 +08:00
commit 61f66423e5
84 changed files with 28268 additions and 0 deletions
@@ -0,0 +1,119 @@
package util.time;
import com.google.common.collect.Lists;
import entity.OriginTimeValue;
import entity.TargetTimeValue;
import org.springframework.util.CollectionUtils;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
/**
* 补时间点工具类
* 之前在ws上班的时候,处理图标数据会遇到某些点没有数据的情况,就需要对这些时间点进行补点处理
*
* @author huangzj
* @date 2018-11-23 22:43:36
*/
public enum FillFullTimeValueUtil {
/**
* 分钟粒度
*/
MINUTE {
@Override
public List<TargetTimeValue> fullFillTimeValue(LocalDateTime startDate, LocalDateTime endDate, int timeInterval,
List<OriginTimeValue> originTimeValues, TimeZone timeZone) {
//Myview 向前聚合,返回前XX秒为最开始计数时间
Instant firstInstant = toInstant(startDate, timeZone);
Instant finalInstant = toInstant(endDate, timeZone);
//补时间点--规则一样,间隔转换成秒
return fullFillRule(originTimeValues, firstInstant, finalInstant, timeInterval * 60);
}
},
/**
* 小时粒度
*/
HOUR {
@Override
public List<TargetTimeValue> fullFillTimeValue(LocalDateTime startDate, LocalDateTime endDate, int timeInterval,
List<OriginTimeValue> originTimeValues, TimeZone timeZone) {
Instant firstInstant = toInstant(startDate, timeZone);
Instant finalInstant = toInstant(endDate, timeZone);
//补时间点--规则一样
return fullFillRule(originTimeValues, firstInstant, finalInstant, timeInterval * 60 * 60);
}
},
/**
* 天粒度
*/
DAY {
@Override
public List<TargetTimeValue> fullFillTimeValue(LocalDateTime startDate, LocalDateTime endDate, int timeInterval,
List<OriginTimeValue> originTimeValues, TimeZone timeZone) {
//区别,把时间转成天
Instant firstInstant = toInstant(LocalDateTime.of(startDate.toLocalDate(), LocalTime.of(0, 0, 0)), timeZone);
Instant finalInstant = toInstant(LocalDateTime.of(endDate.toLocalDate(), LocalTime.of(0, 0, 0)), timeZone);
//补时间点--规则一样
return fullFillRule(originTimeValues, firstInstant, finalInstant, timeInterval * 60 * 60 * 24);
}
};
/**
* 抽象方法,实现补充时间点
* @param startDate 开始时间 格式如:yyyy-MM-dd 00:00:00
* @param endDate 结束时间:格式如:yyyy-MM-dd 23:59:59
* @param timeInterval 数据采集粒度,单位:分钟、小时、天
* @param originTimeValues 缺少时间点对象(统一处理成long、long)
* @param timeZone 时区
* @return 补时间点后对象,没有补null
*/
public abstract List<TargetTimeValue> fullFillTimeValue(LocalDateTime startDate, LocalDateTime endDate,
int timeInterval, List<OriginTimeValue> originTimeValues, TimeZone timeZone);
/**
*
* @param dateTime 时间
* @param timeZone 时区
* @return Instant,和TimeStamp类似
*/
private static Instant toInstant(LocalDateTime dateTime, TimeZone timeZone) {
return dateTime.atZone(timeZone.toZoneId())
.toInstant();
}
private static List<TargetTimeValue> fullFillRule(List<OriginTimeValue> originTimeValues, Instant firstInstant, Instant finalInstant,
int seconds) {
//转换为Time-value形式的map
if (CollectionUtils.isEmpty(originTimeValues)) {
originTimeValues = Lists.newArrayList();
}
Map<Long, Long> timeValueMap = originTimeValues.stream().collect(Collectors.toMap(OriginTimeValue::getTime,
OriginTimeValue::getValue));
final List<TargetTimeValue> resultList = new ArrayList<>();
Instant cursorInstant = firstInstant;
//循环按照时间粒度补充时间点。
while (cursorInstant.isBefore(finalInstant) || cursorInstant.equals(finalInstant)) {
long epochSecond = cursorInstant.getEpochSecond();
TargetTimeValue timeValueInRule = new TargetTimeValue();
timeValueInRule.setValue(timeValueMap.getOrDefault(epochSecond, null));
timeValueInRule.setTime(epochSecond);
resultList.add(timeValueInRule);
//移动到下一个数据点
cursorInstant = cursorInstant.plusSeconds(seconds);
}
//按时间排序,最新的排在最后面
return resultList.parallelStream()
.sorted(Comparator.comparing(TargetTimeValue::getTime))
.collect(Collectors.toList());
}
}