package com.system.bus;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class ReactionTimeUtil {
//将double计算的结果保留两位小数
private static final DecimalFormat decimalFormat = new DecimalFormat("#0.00");
public static final String HOUR = "H";
public static final String MINUTE = "M";
public static final String SECOND = "S";
/**
*
* @param reactionTimeStr 反应时长字符串
* @param timeUnit 需要转化的单位
* @param isLeft \如果为null 则取出所有,如果ture则取出"-"符号的左边,反之取出符号的右边
* 1-1h
* 1-2hours
* 1-3H
* 1-4HOURS
* 1m-1h
* 1h - 3h
* 1-5min
* 1s-10h
* 5-6
* 10m - 10h
* ≥ 10m
* @return
*/
public static String ConvertReactionTimePhaseValue(String reactionTimeStr,String toTimeUnit,Boolean isLeft) {
StringBuffer resultBuffer = new StringBuffer();
//大于符号匹配串
String gtMatchExpressionStr = "≥>>﹥≧";
//小于符号匹配串
String ltMatchExpressionStr = "<≤﹤≦";
//开始时间
String startTimeStr = "";
//结束时间
String endTimeStr = "";
//大于符号的时间单位
String gtTimeUnit = "";
//小于符号的时间单位
String ltTimeUnit = "";
//先将空格置空
reactionTimeStr = reactionTimeStr.replaceAll(" ", "");
if(reactionTimeStr.contains("-")) {
String[] reactionTimeArray = reactionTimeStr.split("-");
startTimeStr = reactionTimeArray[0];
endTimeStr = reactionTimeArray[1];
String startTimeUnit = getTimeUint(startTimeStr);
String endTimeUnit = getTimeUint(endTimeStr);
//如果开始时间没有单位并且结束时间也没有单位则默认按照小时计算
if("".equals(startTimeUnit) && "".equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,HOUR ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是空结束时间单位是小时
if("".equals(startTimeUnit) && HOUR.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,HOUR ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是空结束时间单位是分钟
if("".equals(startTimeUnit) && MINUTE.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,MINUTE ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,MINUTE ,toTimeUnit);
}
//如果开始时间是空结束时间单位是秒钟
if("".equals(startTimeUnit) && SECOND.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,SECOND ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,SECOND ,toTimeUnit);
}
//如果开始时间是单位是小时,结束时间单位是空
if(HOUR.equals(startTimeUnit) && "".equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,HOUR ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是单位是小时,结束时间单位是小时
if(HOUR.equals(startTimeUnit) && HOUR.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,HOUR ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是单位是分钟,结束时间单位是分钟
if(MINUTE.equals(startTimeUnit) && "".equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,MINUTE ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是单位是秒钟,结束时间单位是秒钟
if(SECOND.equals(startTimeUnit) && "".equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,SECOND ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是单位是分钟,结束时间单位是小时
if(MINUTE.equals(startTimeUnit) && HOUR.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,MINUTE ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是单位是秒钟,结束时间单位是小时
if(SECOND.equals(startTimeUnit) && HOUR.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,SECOND ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,HOUR ,toTimeUnit);
}
//如果开始时间是单位是秒钟,结束时间单位是秒钟
if(SECOND.equals(startTimeUnit) && SECOND.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,SECOND ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,SECOND ,toTimeUnit);
}
//如果开始时间是单位是秒钟,结束时间单位是分钟
if(SECOND.equals(startTimeUnit) && MINUTE.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,SECOND ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,MINUTE ,toTimeUnit);
}
//如果开始时间是单位是分钟,结束时间单位是分钟
if(MINUTE.equals(startTimeUnit) && MINUTE.equals(endTimeUnit) ) {
startTimeStr = convertAnyTime(startTimeStr,MINUTE ,toTimeUnit);
endTimeStr = convertAnyTime(endTimeStr,MINUTE ,toTimeUnit);
}
//是否只显示左边,如果为空则显示全部,如果是则只取左边的值,如果不是则取右边的值
if(isLeft == null) {
resultBuffer.append(startTimeStr);
resultBuffer.append("-");
resultBuffer.append(endTimeStr);
}else {
if(isLeft) {
resultBuffer.append(startTimeStr);
}else {
resultBuffer.append(endTimeStr);
}
}
}else {
//查看字符串中是否包含大于符号
for(int i = 0; i < gtMatchExpressionStr.length(); i++) {
char matchSimple = gtMatchExpressionStr.charAt(i);
if(reactionTimeStr.indexOf(matchSimple) > -1) {
String currentSimple = String.valueOf(matchSimple);
if(isLeft == null) {
resultBuffer.append(currentSimple);
}
reactionTimeStr = reactionTimeStr.replaceAll(currentSimple, "");
//大于符号的时间单位
gtTimeUnit = getTimeUint(reactionTimeStr);
break;
}
}
//查看字符串中是否包含小于符号
for(int i = 0; i < ltMatchExpressionStr.length(); i++) {
char matchSimple = ltMatchExpressionStr.charAt(i);
if(reactionTimeStr.indexOf(matchSimple) > -1) {
String currentSimple = String.valueOf(matchSimple);
if(isLeft == null) {
resultBuffer.append(currentSimple);
}
reactionTimeStr = reactionTimeStr.replaceAll(currentSimple, "");
//小于符号的时间单位
ltTimeUnit = getTimeUint(reactionTimeStr);
break;
}
}
//如果带有大于符号的元素单位是小时
if(HOUR.equals(gtTimeUnit) || "".equals(gtTimeUnit) ) {
resultBuffer.append(convertAnyTime(reactionTimeStr,HOUR ,toTimeUnit));
}
//如果带有大于符号的元素单位是分钟
if(MINUTE.equals(gtTimeUnit)) {
resultBuffer.append(convertAnyTime(reactionTimeStr,MINUTE ,toTimeUnit));
}
//如果带有大于符号的元素单位是秒钟
if(SECOND.equals(gtTimeUnit)) {
resultBuffer.append(convertAnyTime(reactionTimeStr,SECOND ,toTimeUnit));
}
//如果带有小于符号的元素单位是小时
if(HOUR.equals(ltTimeUnit)) {
resultBuffer.append(convertAnyTime(reactionTimeStr,HOUR ,toTimeUnit));
}
//如果带有小于符号的元素单位是分钟
if(MINUTE.equals(ltTimeUnit)) {
resultBuffer.append(convertAnyTime(reactionTimeStr,MINUTE ,toTimeUnit));
}
//如果带有小于符号的元素单位是秒钟
if(SECOND.equals(ltTimeUnit)) {
resultBuffer.append(convertAnyTime(reactionTimeStr,SECOND ,toTimeUnit));
}
}
return resultBuffer.toString();
}
/**
* @param timeStr
* @desc 输入字符串获取时间单位比如 1h 或者 1hour 返回H
* @return
*
*/
public static String getTimeUint(String timeStr) {
String currentTimeUnit = "";
HashMap<String,String> timeUnitHashMap = new HashMap<>();
timeUnitHashMap.put("h", HOUR);
timeUnitHashMap.put("hour", HOUR);
timeUnitHashMap.put("hours", HOUR);
timeUnitHashMap.put("H", HOUR);
timeUnitHashMap.put("m", MINUTE);
timeUnitHashMap.put("min", MINUTE);
timeUnitHashMap.put("minute", MINUTE);
timeUnitHashMap.put("minutes", MINUTE);
timeUnitHashMap.put("M", MINUTE);
timeUnitHashMap.put("s", SECOND);
timeUnitHashMap.put("second", SECOND);
timeUnitHashMap.put("seconds", SECOND);
timeUnitHashMap.put("S", SECOND);
for(String timeUnit:timeUnitHashMap.keySet()) {
if(timeStr.contains(timeUnit)) {
currentTimeUnit = timeUnitHashMap.get(timeUnit);
break;
}
}
return currentTimeUnit;
}
/**
*
* @param reactionTime 反应时间
* @param currentUnit 当前时间单位 h,m,s
* @param convertUnit 需要转化的单位 h,m,s
* @return 转换后的值
* @desc 输入反应时间比如 1h 当前单位h,转化为目标单位比如s
*/
public static String convertAnyTime(String reactionTime,String currentUnit,String convertUnit) {
String result = "";
if(HOUR.equals(currentUnit)) {
reactionTime = reactionTime.replaceAll("hours", "").replaceAll("hour", "").replaceAll("h", "").replaceAll("H", "");
Long reactionTimeLongValue = Long.parseLong(reactionTime);
if(HOUR.equals(convertUnit)) {
result = String.valueOf(reactionTimeLongValue);
}
if(MINUTE.equals(convertUnit)) {
result = String.valueOf(TimeUnit.HOURS.toMinutes(reactionTimeLongValue));
}
if(SECOND.equals(convertUnit)) {
result = String.valueOf(TimeUnit.HOURS.toSeconds(reactionTimeLongValue));
}
}
if(MINUTE.equals(currentUnit)) {
reactionTime = reactionTime.replaceAll("minute", "").replaceAll("min", "").replaceAll("m", "");
Long reactionTimeLongValue = Long.parseLong(reactionTime);
if(HOUR.equals(convertUnit)) {
result = decimalFormat.format(reactionTimeLongValue/60d);
}
if(MINUTE.equals(convertUnit)) {
result = String.valueOf(reactionTimeLongValue);
}
if(SECOND.equals(convertUnit)) {
result = String.valueOf(TimeUnit.MINUTES.toSeconds(reactionTimeLongValue));
}
}
if(SECOND.equals(currentUnit)) {
reactionTime = reactionTime.replaceAll("second", "").replaceAll("s", "").replaceAll("S", "");
Long reactionTimeLongValue = Long.parseLong(reactionTime);
if(HOUR.equals(convertUnit)) {
result = decimalFormat.format(reactionTimeLongValue/3600d);
}
if(MINUTE.equals(convertUnit)) {
result = decimalFormat.format(reactionTimeLongValue/60d);
}
if(SECOND.equals(convertUnit)) {
result = String.valueOf(reactionTimeLongValue);
}
}
return result;
}
public static void main(String[] args) {
List<String> checkList = new ArrayList<>();
checkList.add("1 - 1");
checkList.add(" 1 -2 h ");
checkList.add("1-2H");
checkList.add("1-2hour");
checkList.add("5min-2h");
checkList.add("5s-2h");
checkList.add("5min-2min");
checkList.add("5m-2min");
checkList.add(">10min");
checkList.add("≥26");
for(String timePhase:checkList) {
System.out.println(ConvertReactionTimePhaseValue(timePhase,ReactionTimeUtil.SECOND,null));
}
}
}
任意时间转小时
任意时间转分钟
任意时间转秒钟