>

(비디오 플레이어 카운터와는) 문자열의 시간 형식이 다릅니다. 예를 들면 다음과 같습니다.

03:45 -> 3 munutes, 45 seconds
1:03:45 -> 1 hour, 3 munutes, 45 seconds
123:03:45 -> 123 hours, 3 munutes, 45 seconds

LocalTime lib로이 모든 형식을 어떻게 파싱 할 수 있습니까?

이러한 코드를 사용하는 경우 :

LocalTime.parse(time, DateTimeFormatter.ofPattern("[H[H]:]mm:ss"));

"1:03:45"또는 "11:03:45"에서는 제대로 작동하지만 "03:55"에는 예외가 있습니다

java.time.format.DateTimeParseException: Text '03:55' could not be parsed at index 5


  • 답변 # 1

    더 많은 가능성이 있습니다. Duration.parse 가 허용하는 구문에 맞게 시간 문자열을 수정하려고 할 것입니다. .

       String[] timeStrings = { "03:45", "1:03:45", "123:03:45" };
        for (String timeString : timeStrings) {
            String modifiedString = timeString.replaceFirst("^(\\d+):(\\d{2}):(\\d{2})$", "PT$1H$2M$3S")
                    .replaceFirst("^(\\d+):(\\d{2})$", "PT$1M$2S");
            System.out.println("Duration: " + Duration.parse(modifiedString));
        }
    
    

    출력은 :

    와이즈 비즈 와이즈 비즈

    시간, 분 및 초 (2 콜론)의 경우

    에 대한 첫 번째 호출로 처리됩니다.
    는 콜론을 모두 제거하고 두 번째 
    Duration: PT3M45S
    Duration: PT1H3M45S
    Duration: PT123H3M45S
    를 확인합니다.
     아무것도 대체하지 않습니다. 콜론이 하나 (분과 초) 인 경우 첫 번째 
    replaceFirst
    
     아무것도 다시 만들 수 없으며 문자열을 변경하지 않고 두 번째 
    replaceFirst
    로 전달합니다.
     
    replaceFirst
    가 승인 한 ISO 8601 형식으로 변환되는 호출
    .

    당신은 replaceFirst 가 필요합니다  두 가지 이유로 클래스 : (1) 내가 올바르게 이해하면 시간 문자열은 기간을 나타내므로 Duration.parse 를 사용하십시오.  는 정확하지 않으며 코드를 유지 관리하는 사람들을 혼란스럽게합니다. (2) Duration 의 최대 값  23 : 59 : 59.999999999이므로 123 : 03 : 45를 허용하지 않습니다.

  • 답변 # 2

    댓글과 내가 읽은 내용에서 LocalTime 를 구문 분석 할 수 없습니다. , 문제를 해결하려면 모든 시간을 초로 변환 한 다음 해당 초를LocalTime이 아닌지속 시간으로 변환하면 다음과 같은 문제에 대한 해결책이 있습니다.

    LocalTime
    
    

    출력 또는 지속 시간은

    mm:ss
    
    
    String[] times = {"03:45", "1:03:45", "123:03:45"}; for (String time : times) { List<Integer> parts = Arrays.stream(time.split(":")) .map(Integer::valueOf) .collect(Collectors.toList()); Collections.reverse(parts); int seconds = (int) IntStream.range(0, parts.size()) .mapToDouble(index -> parts.get(index) * Math.pow(60, index)) .sum(); Duration result = Duration.ofSeconds(seconds); System.out.println(result); }

  • 이전 powershell - IP 주소로 루프
  • 다음 javascript - 구조체의 samplerCube로 인해 GL_INVALID_OPERATION