diff --git a/src/main/java/com/imyeyu/utils/Time.java b/src/main/java/com/imyeyu/utils/Time.java index 1c844c2..ec4ccaf 100644 --- a/src/main/java/com/imyeyu/utils/Time.java +++ b/src/main/java/com/imyeyu/utils/Time.java @@ -255,6 +255,51 @@ public class Time { return Instant.ofEpochMilli(unixTime).atZone(ZoneId.systemDefault()).toLocalDateTime(); } + + /** + * 将时间字符串解析为毫秒值 + * + *
支持的格式示例: + *
+ * 10 = 10 + * 10ms = 10 + * 10s = 10,000 + * 10m = 600,000 + * 10h = 36,000,000 + * 10d = 10D = 10 d = 864,000,000 + * 10.5d = 907,200,000 + *+ * + * @param timeStr 时间字符串 + * @return 毫秒 + * @throws IllegalArgumentException 输入格式无效 + */ + public static long parseToMS(String timeStr) { + if (TimiJava.isEmpty(timeStr)) { + throw new IllegalArgumentException("not found timeStr"); + } + String normalized = timeStr.replaceAll("\\s+", "").toLowerCase(); + + Pattern pattern = Pattern.compile("^(\\d+(?:\\.\\d+)?)(ms|[dhms])?$"); + Matcher matcher = pattern.matcher(normalized); + if (!matcher.matches()) { + throw new IllegalArgumentException("invalid format: " + timeStr); + } + double value = Double.parseDouble(matcher.group(1)); + String unit = matcher.group(2); + if (TimiJava.isEmpty(unit) || unit.equals("ms")) { + return Math.round(value); + } + double multiplier = switch (unit) { + case "s" -> Time.S; + case "m" -> Time.M; + case "h" -> Time.H; + case "d" -> Time.D; + default -> throw new IllegalArgumentException("invalid format unit: " + unit); + }; + return Math.round(value * multiplier); + } + /** * 媒体时间操作 * diff --git a/src/test/java/test/TestTime.java b/src/test/java/test/TestTime.java index 1bf51fe..95afb34 100644 --- a/src/test/java/test/TestTime.java +++ b/src/test/java/test/TestTime.java @@ -1,8 +1,24 @@ package test; +import com.imyeyu.utils.Time; +import org.junit.jupiter.api.Test; + /** * @author 夜雨 * @since 2024-12-19 22:10 */ public class TestTime { -} \ No newline at end of file + + @Test + public void testParseToMS() { + assert Time.parseToMS("10") == 10; + assert Time.parseToMS("10ms") == 10; + assert Time.parseToMS("10MS") == 10; + assert Time.parseToMS("10 ms") == 10; + assert Time.parseToMS("10s") == Time.S * 10; + assert Time.parseToMS("10m") == Time.M * 10; + assert Time.parseToMS("10h") == Time.H * 10; + assert Time.parseToMS("10d") == Time.D * 10; + assert Time.parseToMS("10.5d") == Time.D * 10 + Time.D * .5; + } +}