【问题标题】:Java 8 Time API: how to parse string of format “mm:ss” to Duration?Java 8 Time API:如何将“mm:ss”格式的字符串解析为持续时间?
【发布时间】:2014-07-08 22:28:57
【问题描述】:

我尝试使用 DateTimeFormatter,但没有找到方法。 Duration.parse("") 只使用特殊格式。

【问题讨论】:

  • 问题是我必须使用 java.time.Duration 类,而不是 joda time 类。
  • 我找到了将字符串解析为 TemporalAccessor 的方法,可能有办法从中获取 Duration?
  • 你可以使用 DateTimeFormatter 吗?

标签: datetime java-8


【解决方案1】:

可以自己解析String,重新格式化成Duration要求的格式

String value = ... //mm:ss
String[] fields = value.split(":");
return Duration.parse(String.format("P%dM%sS", fields[0], fields[1]));

【讨论】:

  • 我想使用java 8的一些功能,因为格式可以稍后更改,但现在它适合了。谢谢,dkatzel。
【解决方案2】:

恕我直言,java 8 不提供任何自定义持续时间解析的工具。

您应该“手动”执行此操作。例如(一种有效的方式):

import static java.lang.Integer.valueOf;

import java.time.Duration;

public class DurationParser {
    public static Duration parse(String input) {
        int colonIndex = input.indexOf(':');
        String mm = input.substring(0, colonIndex);
        String ss = input.substring(colonIndex + 1);
        return Duration.ofMinutes(valueOf(mm)).plusSeconds(valueOf(ss));
    }
}

【讨论】:

    【解决方案3】:

    公认的答案引导着正确的方向,但它存在以下问题,初学者可能难以弄清楚和纠正:

    1. 它不遵循以PT 开头的correct format of Duration
    2. 它应该使用%s 而不是%d 来表示fields[0],因为fields[0] 的类型是String

    改正这两件事后,return语句会变成

    return Duration.parse(String.format("PT%sM%sS", fields[0], fields[1]));
    

    拆分和格式化的替代方法是使用String#replaceAll,如下所示:

    import java.time.Duration;
    
    public class Main {
        public static void main(String[] args) {
            // Test
            System.out.println(parseToDuration("09:34"));
            System.out.println(parseToDuration("90:34"));
            System.out.println(parseToDuration("9:34"));
            System.out.println(parseToDuration("0:34"));
            System.out.println(parseToDuration("00:04"));
            System.out.println(parseToDuration("1:2"));
        }
    
        static Duration parseToDuration(String value) {
            return Duration.parse(value.replaceAll("(\\d{1,2}):(\\d{1,2})", "PT$1M$2S"));
        }
    }
    

    输出:

    PT9M34S
    PT1H30M34S
    PT9M34S
    PT34S
    PT4S
    PT1M2S
    

    正则表达式(\d{1,2}):(\d{1,2}) 有两个capturing groups:在替换字符串中用$1 指定group(1),用$2 指定group(2)。每个捕获组都有\d{1,2},它指定1 to 2digit(s)

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-22
      • 2021-07-13
      相关资源
      最近更新 更多