gasWellWatch/src/main/java/com/isu/gaswellwatch/vo/command/Timing.java

114 lines
4.4 KiB
Java

package com.isu.gaswellwatch.vo.command;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import java.security.InvalidParameterException;
import java.time.LocalTime;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
/**
* @author <a href="mailto:scwsl@foxmail.com">王仕龙</a>
* 2024/11/26 21:08
*/
public interface Timing {
default String timeValidate(String time, String name, int maxHours) {
if (StringUtils.isBlank(time)) {
throw new NullPointerException(name + " cannot be empty");
}
if (!StringUtils.contains(time, ":")) {
throw new InvalidParameterException(name + " is invalid. Valid format: [0-" + maxHours + "]:[0-59]:[0-59]");
}
String[] times = StringUtils.split(time, ":");
int hour = 0, minute = 0, second = 0;
if (times.length == 1) {
hour = NumberUtils.createInteger(times[0]);
} else if (times.length == 2) {
hour = NumberUtils.createInteger(times[0]);
minute = NumberUtils.createInteger(times[1]);
} else if (times.length == 3) {
hour = NumberUtils.createInteger(times[0]);
minute = NumberUtils.createInteger(times[1]);
second = NumberUtils.createInteger(times[2]);
} else {
throw new InvalidParameterException(name + " is invalid. Valid format: [0-" + maxHours + "]:[0-59]:[0-59]");
}
if (!(hour >= 0 && hour <= maxHours && minute >= 0 && minute <= 59 && second >= 0 && second <= 59)) {
throw new InvalidParameterException(name + " is invalid. Valid format: [0-" + maxHours + "]:[0-59]:[0-59]");
}
return StringUtils.joinWith(":", StringUtils.leftPad(String.valueOf(hour), 2, "0"),
StringUtils.leftPad(String.valueOf(minute), 2, "0"),
StringUtils.leftPad(String.valueOf(minute), 2, "0"));
}
default String timerValidate(String time, String name) {
return this.timeValidate(time, name, 23);
}
default String timingValidate(String time, String name) {
return this.timeValidate(time, name, 999);
}
default String toHexString(LocalTime time) {
return Objects.equals(LocalTime.MIN, time) ? "000000000000" :
Objects.equals(LocalTime.MAX, time) ? "0017003B003B" :
this.toHexString(time.toString());
}
/**
* 支持:[0-999]:[0-59]:[0-59]
*
* @param stringTime
* @return
*/
default String toHexString(String stringTime) {
if (StringUtils.equals(stringTime, "00:00") || StringUtils.equals(stringTime, "00:00:00")) {
return "000000000000";
}
if (StringUtils.equals(stringTime, "23:59:59")) {
return "0017003B003B";
}
if (StringUtils.equals(stringTime, "999:59:59")) {
return "03E7003B003B";
}
String[] items = StringUtils.split(stringTime, ":");
int hours = Integer.parseInt(items[0]);
int minutes = items.length < 2 ? 0 : Integer.parseInt(items[1]);
int seconds = items.length < 3 ? 0 : Integer.parseInt(items[2]);
return StringUtils.leftPad(Integer.toHexString(hours), 4, "0") +
StringUtils.leftPad(Integer.toHexString(minutes), 4, "0") +
StringUtils.leftPad(Integer.toHexString(seconds), 4, "0");
}
/**
* 支持:[0-999]:[0-59]:[0-59]
*
* @param stringTime 时间
* @return 返回秒数
*/
default long toSeconds(String stringTime) {
String[] values = StringUtils.split(stringTime, ":");
int hours = 0, minutes = 0, seconds = 0;
switch (values.length) {
case 1 -> {
seconds = NumberUtils.createInteger(values[0]);
}
case 2 -> {
minutes = NumberUtils.createInteger(values[0]);
seconds = NumberUtils.createInteger(values[1]);
}
case 3 -> {
hours = NumberUtils.createInteger(values[0]);
minutes = NumberUtils.createInteger(values[1]);
seconds = NumberUtils.createInteger(values[2]);
}
default -> {
throw new RuntimeException("格式不合法");
}
}
return TimeUnit.HOURS.toSeconds(hours) + TimeUnit.MINUTES.toSeconds(minutes) + seconds;
}
}