解析时间字符串,如“1h 30min”

2022-09-01 00:53:16

任何人都知道一个Java库,它可以将时间字符串(如“30min”或“2h 15min”或“2d 15h 30min”)解析为毫秒(或某种持续时间对象)。Joda-Time可以做这样的事情吗?

(我有一个丑陋的长方法可以维护,可以进行这样的解析,并希望摆脱它/用做得更好的东西替换它。


答案 1

您可能需要根据自己的格式对此进行一些调整,但请尝试以下方法:

PeriodFormatter formatter = new PeriodFormatterBuilder()
    .appendDays().appendSuffix("d ")
    .appendHours().appendSuffix("h ")
    .appendMinutes().appendSuffix("min")
    .toFormatter();

Period p = formatter.parsePeriod("2d 5h 30min");

请注意,如果您需要使其更灵活,则有一个接受参数。appendSuffixvariants

更新:Joda Time 此后添加了 Period.toStandardDuration(),从那里您可以使用 getStandardSeconds() 将经过的时间(以秒为单位)作为 .long

如果您使用的是没有这些方法的旧版本,您仍然可以通过假设一天中的标准24 / hr,60min / hr等来自己计算时间戳(在这种情况下,利用类中的常量来避免对幻数的需求。DateTimeConstants


答案 2

持续时间解析现在包含在 Java 8 中。将标准 ISO 8601 格式与持续时间.parse 结合使用

Duration d = Duration.parse("PT1H30M")

您可以将此持续时间转换为总长度(以毫秒为单位)。请注意,分辨率为纳秒,因此您可能会丢失从纳秒毫秒Duration

long milliseconds = d.toMillis();

格式与您描述的格式略有不同,但可以很容易地从一种格式翻译成另一种格式。


推荐