gpt4 book ai didi

java - 解析为 LocalTime 模式 mm :ss. S

转载 作者:行者123 更新时间:2023-12-05 08:36:12 24 4
gpt4 key购买 nike

如何从字符串中解析 LocalTime,例如mm:ss.S 格式的“10:38.0”?我努力改变格式。

    public static LocalTime parseTime(String time) {
return localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("mm:ss.S"));
}

获取错误

java.time.format.Parsed 类型的 ISOjava.time.format.DateTimeParseException:无法解析文本“10:38.2”:无法从 TemporalAccessor 获取 LocalTime:{MinuteOfHour=10,MicroOfSecond=200000,MilliOfSecond=200,NanoOfSecond=200000000,SecondOfMinute=38},

最佳答案

java.time.Duration.parse()

正如其他一些人正确而明智地指出的那样,您的示例字符串 10:38.0 看起来更像是一个时间量,一个持续时间。不像一天中午夜后 10 分钟多一点的时间。所以 LocalTime 不是在这里使用的正确类。使用持续时间。并将字符串解析为 Duration 对象。

不过,Duration 类只支持解析 ISO 8601 格式。 ISO 8601 格式类似于 PT10M38.0S,持续 10 分 38.0 秒(或者例如 PT10M38SPT10M38.00000S,它们也工作)。有更多方法可以克服此限制。 Arvind Kumar Avinash 已经在他的回答中展示了一个。我的方法是在解析之前转换字符串:

public static Duration parseTime(String time) {
String iso = time.replaceFirst("^(\\d+):(\\d+(?:\\.\\d*)?)$", "PT$1M$2S");
return Duration.parse(iso);
}

让我们试试看:

    Duration dur = parseTime("10:38.0");
System.out.println(dur);

输出是:

PT10M38S

您会看到 Duration 也以 ISO 8601 格式打印回来。

根据您希望进行的进一步处理,您可能会在该类的文档中找到许多有用的方法;链接如下。

如何 time.replaceFirst("^(\\d+):(\\d+(?:\\.\\d*)?)$", "PT$1M$2S") 有效: 我正在使用正则表达式来匹配您的字符串:

  • ^:匹配字符串的开头。
  • (\\d+):匹配一个或多个数字的捕获组。圆括号表示捕获组。我将在下面的替换中需要此功能。
  • :: 一个冒号(真的)。
  • (\\d+(?:\\.\\d*)?):一组捕获的数字,可选地后跟一个点和零个或多个其他数字。 (?: 表示我使用的非捕获组的开头,因为我不需要在替换中单独使用它。? 在非捕获组之后表示它是可选的(因此没有分数的 38 也适用于秒数)。
  • $:匹配字符串的结尾

在我的替换字符串中,PT$1M$2S$1$2 表示行进的内容第一和第二个捕获组,将 1038.0 插入到结果字符串中以获得 PT10M38.0S

带有外部库的更好的解决方案:Time4J

使用上面的非平凡正则表达式使您的字符串和 Duration.parse() 满足并不是完美的解决方案。 Time4J 库支持基于模式的持续时间解析。因此,如果您可以容忍外部依赖,请考虑使用它。详见 Time4J 作者 Meno Hochshield 的回答。

链接

关于java - 解析为 LocalTime 模式 mm :ss. S,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69803260/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com