В основном я хочу преобразовать этот формат ISO PT18M8S во что-то вроде 13:09 или 10000ms. Я получаю этот формат из YouTube Data API v3:

Изображение возвращаемого JSON

Ответы (2)

Вы можете использовать java.time.Duration, который смоделирован на стандартах ISO-8601 и был представлен в Java-8 как часть реализации JSR-310. В Java-9 было введено еще несколько удобных методов.

Если вы просмотрели приведенные выше ссылки, вы, возможно, уже заметили, что PT18M8S определяет продолжительность 18 минут 8 секунд, которую можно разобрать до объекта Duration и из этого объекта создать строку, отформатированную в соответствии с вашими требованиями, получив из нее дни, часы, минуты, секунды.

Демонстрация:

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        String strIso8601Duration = "PT18M8S";

        Duration duration = Duration.parse(strIso8601Duration);
        // Default format
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedElapsedTime = String.format("%02d:%02d:%02d", duration.toHours() % 24,
                duration.toMinutes() % 60, duration.toSeconds() % 60);
        System.out.println(formattedElapsedTime);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedElapsedTime = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
        System.out.println(formattedElapsedTime);
        // ##############################################################################

        System.out.println(duration.toMillis() + " milliseconds");
    }
}

Выход:

PT18M8S
00:18:08
00:18:08
1088000 milliseconds

Узнайте о современном API для работы с датой-временем из Trail: Дата-Время.

    object YouTubeDurationConverter {
    
        private fun getHours(time: String): Int {
            return time.substring(time.indexOf("T") + 1, time.indexOf("H")).toInt()
        }
    
        private fun getMinutes(time: String): Int {
            return time.substring(time.indexOf("H") + 1, time.indexOf("M")).toInt()
        }
    
        private fun getMinutesWithNoHours(time: String): Int {
            return time.substring(time.indexOf("T") + 1, time.indexOf("M")).toInt()
        }
    
        private fun getMinutesWithNoHoursAndNoSeconds(time: String): Int {
            return time.substring(time.indexOf("T") + 1, time.indexOf("M")).toInt()
        }
    
        private fun getSecondsOnly(time: String): Int {
            return time.substring(time.indexOf("T") + 1, time.indexOf("S")).toInt()
        }
    
        private fun getSecondsWithMinutes(time: String): Int {
            return time.substring(time.indexOf("M") + 1, time.indexOf("S")).toInt()
        }
    
        private fun getSecondsWithHours(time: String): Int {
            return time.substring(time.indexOf("H") + 1, time.indexOf("S")).toInt()
        }
    
        private fun convertToFormatedTime(time: String): FormatedTime {
    
            val HOURS_CONDITION = time.contains("H")
            val MINUTES_CONDITION = time.contains("M")
            val SECONDS_CONDITION = time.contains("S")
    
            /**
             *potential cases
             *hours only
             *minutes only
             *seconds only
             *hours and minutes
             *hours and seconds
             *hours and minutes and seconds
             *minutes and seconds
             */
            val formatTime = FormatedTime(-1, -1, -1)
    
            if (time.equals("P0D")) {
                //Live Video
                return formatTime
            } else {
                var hours = -1
                var minutes = -1
                var seconds = -1
    
                if (HOURS_CONDITION && !MINUTES_CONDITION && !SECONDS_CONDITION) {
                    //hours only
                    hours = getHours(time)
                } else if (!HOURS_CONDITION && MINUTES_CONDITION && !SECONDS_CONDITION) {
                    //minutes only
                    minutes = getMinutesWithNoHoursAndNoSeconds(time)
    
                } else if (!HOURS_CONDITION && !MINUTES_CONDITION && SECONDS_CONDITION) {
                    //seconds only
                    seconds = getSecondsOnly(time)
    
    
                } else if (HOURS_CONDITION && MINUTES_CONDITION && !SECONDS_CONDITION) {
                    //hours and minutes
                    hours = getHours(time)
                    minutes = getMinutes(time)
    
                } else if (HOURS_CONDITION && !MINUTES_CONDITION && SECONDS_CONDITION) {
                    //hours and seconds
                    hours = getHours(time)
                    seconds = getSecondsWithHours(time)
    
    
                } else if (HOURS_CONDITION && MINUTES_CONDITION && SECONDS_CONDITION) {
                    //hours and minutes and seconds
                    hours = getHours(time)
                    minutes = getMinutes(time)
                    seconds = getSecondsWithMinutes(time)
    
    
                } else if (!HOURS_CONDITION && MINUTES_CONDITION && SECONDS_CONDITION) {
                    //minutes and seconds
                    minutes = getMinutesWithNoHours(time)
                    seconds = getSecondsWithMinutes(time)
    
                }
                return FormatedTime(hours, minutes, seconds)
            }
        }
    
        fun getTimeInStringFormated(time: String): String {
            val formatedTime = convertToFormatedTime(time)
            val timeFormate: StringBuilder = StringBuilder("")
    
            if (formatedTime.hour == -1) {
                timeFormate.append("00:")
            } else if (formatedTime.hour.toString().length == 1) {
                timeFormate.append("0" + (formatedTime.hour).toString() + ":")
            } else {
                timeFormate.append((formatedTime.hour).toString() + ":")
            }
            if (formatedTime.minutes == -1) {
                timeFormate.append("00:")
            } else if (formatedTime.minutes.toString().length == 1) {
                timeFormate.append("0" + (formatedTime.minutes).toString() + ":")
            } else {
                timeFormate.append((formatedTime.minutes).toString() + ":")
            }
    
            if (formatedTime.second == -1) {
                timeFormate.append("00")
            } else if (formatedTime.second.toString().length == 1) {
                timeFormate.append("0" + (formatedTime.second).toString())
            } else {
                timeFormate.append(formatedTime.second)
            }
            return timeFormate.toString()
        }
    
        fun getTimeInSeconds(time: String): Int {
    
            val formatedTime = convertToFormatedTime(time)
            var tottalTimeInSeconds = 0
            if (formatedTime.hour != -1) {
                tottalTimeInSeconds += (formatedTime.hour * 60 * 60)
            }
            if (formatedTime.minutes != -1) {
                tottalTimeInSeconds += (formatedTime.minutes * 60)
            }
            if (formatedTime.second != -1) {
                tottalTimeInSeconds += (formatedTime.second)
    
            }
            return tottalTimeInSeconds
        }
        fun getTimeInMillis(time: String):Long
        {
            val timeInSeconds = getTimeInSeconds(time)
            return (timeInSeconds*1000).toLong()
        }}
    
    
    data class FormatedTime (var hour:Int,var minutes:Int,var second:Int)
    
     
    Output Sample
    1.getTimeInStringFormated: 11:54:48
2.getTimeInSeconds: 42888
3.getTimeInMillis: 42888000

2022 WebDevInsider