/**
* 业务时间处理
*
* @author hua
* @date 2023-08-07 11:47
*/
public class BusinessTimeUtil {
/**
* 时间段比较
* @param typeToRangesMap
* @param start
* @param end
* @return
*/
public static int determineSegmentType(Map<Integer, List<DateRange>> typeToRangesMap, Date start, Date end) {
for (Map.Entry<Integer, List<DateRange>> entry : typeToRangesMap.entrySet()) {
for (DateRange range : entry.getValue()) {
if ((start.after(range.getStart())|| start.equals(range.getStart()) )&& (end.before(range.getEnd())|| end== range.getEnd())) {
return entry.getKey();
}
}
}
return -1;
}
/**
* 拆分时间段
* @param chargeRule 充电规则
* @param segments 分为48段
* @return
*/
public static List<TimeSlot> splitDayIntoSegments(ChargeRule chargeRule, int segments) {
List<TimeSlot> timeSlots = new ArrayList<>();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
Date startTime, endTime;
try {
startTime = sdf.parse("00:00");
endTime = sdf.parse("23:59");
long segmentDuration = (endTime.getTime() - startTime.getTime()) / segments;
Map<Integer, List<DateRange>> typeToRangesMap = prepareTimeRanges(chargeRule);
int last = -1;
for (int i = 0; i < segments; i++) {
long startMillis = startTime.getTime() + i * segmentDuration;
long endMillis = startMillis + segmentDuration;
Date start = new Date(startMillis);
Date end = new Date(endMillis);
if(i>0){
start=addMinutesToDate(start,1);
}
int type = determineSegmentType(typeToRangesMap, start, end);
//所有的字段类型应该不为空,为空时使用最近的分类
if(type!=-1){
last=type;
}else{
type=last;
}
timeSlots.add(new TimeSlot(start, end, type));
}
} catch (ParseException e) {
e.printStackTrace();
}
return timeSlots;
}
public static Date addMinutesToDate(Date date, int minutes) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MINUTE, minutes);
return calendar.getTime();
}
/**
* 解析充电规则 抽取段数据
* @param chargeRule
* @return
*/
public static Map<Integer, List<DateRange>> prepareTimeRanges(ChargeRule chargeRule) {
Map<Integer, List<DateRange>> typeToRangesMap = new HashMap<>();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String[] fields = {
chargeRule.getTipMorningTime(), chargeRule.getTipNoonTime(), chargeRule.getTipAfternoonTime(), chargeRule.getTipNightTime(),
chargeRule.getPeakMorningTime(), chargeRule.getPeakNoonTime(), chargeRule.getPeakAfternoonTime(), chargeRule.getPeakNightTime(),
chargeRule.getFlatMorningTime(), chargeRule.getFlatNoonTime(), chargeRule.getFlatAfternoonTime(), chargeRule.getFlatNightTime(),
chargeRule.getValleyMorningTime(), chargeRule.getValleyNoonTime(), chargeRule.getValleyAfternoonTime(), chargeRule.getValleyNightTime()
};
for (int i = 0; i < fields.length; i++) {
if(StringUtil.isNotNull(fields[i])){
String[] times = fields[i].split(",");
if (times.length == 2 && !times[0].isEmpty() && !times[1].isEmpty()) {
try {
DateRange range = new DateRange(sdf.parse(times[0]), sdf.parse(times[1]));
typeToRangesMap.computeIfAbsent(i / 4, k -> new ArrayList<>()).add(range);
} catch (ParseException e) {
e.printStackTrace();
}
}
}
}
return typeToRangesMap;
}
public static byte[] getBitByChargeRule(ChargeRule cr){
List<TimeSlot> timeSlots = splitDayIntoSegments(cr,48);
byte[] time_long = new byte[48];
for (int i=0;i<48;i++) {
TimeSlot slot= timeSlots.get(i);
System.out.println(slot);
time_long[i]= (byte) (slot.type);
}
return time_long;
}
//测试
public static void main(String[] args) {
ChargeRule cr = new ChargeRule();
cr.setTipMorningTime("00:00,02:00");
cr.setFlatMorningTime("02:00,04:00");
cr.setValleyMorningTime("04:00,05:00");
List<TimeSlot> timeSlots = splitDayIntoSegments(cr,48);
for (int i=0;i<48;i++) {
System.out.println(timeSlots.get(i));
}
}
}
记录一次写【云快充充电协议】时间适配48个小段代码
最新推荐文章于 2024-05-27 16:49:39 发布