在 Kotlin 中将 ISO 8601 持续时间转换为人类可读的文本

Convert ISO 8601 duration to human-readable text in Kotlin

我有一个 ISO duration 的“PT11M1S”(来自 YouTube API)。我知道这意味着 11 分 1 秒,但有什么方法可以在 Kotlin 中自动将其转换为对用户有意义的文本(而不是“PT11M1S”字符串)?

谢谢!

目标:Java 8+

使用java.time得到一个Duration对象。似乎没有 a great formatting solution, and the replaceAll one ,所以这里有一个 Kotlin 等价物:

fun humanReadableDuration(s: String): String = java.time.Duration.parse(s).toString()
        .substring(2).toLowerCase().replace(Regex("[hms](?!$)")) { "${it.value} " }

fun main() = println(humanReadableDuration("PT11M1S"))  // prints "11m 1s"

正则表达式在 h/m/s 之后添加 spaces 但如果它是字符串的末尾则不添加,以避免尾随 space.


目标:任何

因为您已经从字符串开始,所以您可以完全避免 Duration 对象:

fun humanReadableDuration(s: String): String = s.substring(2)
        .toLowerCase().replace(Regex("[hms](?!$)")) { "${it.value} " }