【问题标题】:Convert seconds into T1H15M5S (ISO_8601)将秒转换为 T1H15M5S (ISO_8601)
【发布时间】:2013-07-29 09:01:42
【问题描述】:

我想在 Java 中将秒数转换为 ISO_8601/Duration。

http://en.wikipedia.org/wiki/ISO_8601#Durations

是否有任何已经内置的方法可以做到这一点?

【问题讨论】:

  • 主要研究,Google,Stackoverflow 为什么?
  • 因为在我看来它就像是对 tostring 方法的简单格式化。我不知道你需要哪些参数,但看起来很简单
  • 我猜想使用 mod 函数并自己做其他数学运算。但问题是要知道是否存在某些东西。我可能不是第一个尝试这样做的人(我希望)。
  • 你能告诉我格式是怎样的吗,比如 HH:MM:SS:mm?

标签: java time converter duration


【解决方案1】:

Duration#ofSeconds

演示:

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        System.out.println(Duration.ofSeconds(4711));
    }
}

输出:

PT1H18M31S

【讨论】:

    【解决方案2】:

    我赞同 JodaTime 库的推荐;但我建议使用 toString() 或 Joda 的 ISOPeriodFormat 类,因为小时间段(如 300 秒)将显示为“PT0H5M0S”,尽管它是正确的,但可能会失败,例如(写得不好)ISO 认证测试期望“PT5M”。

    Period period = new Period(1000 * seconds);
    
    String duration1 = period.toString();
    String duration2 = ISOPeriodFormat.standard().print(period);
    

    虽然我从未见过 period.toString() 给出不正确的结果,但为了清楚起见,我使用 ISOPeriodFormat。

    【讨论】:

      【解决方案3】:

      我建议使用 JodaTime 库中的 Period 对象。然后你可以写一个这样的方法:

      public static String secondsAsFormattedString(long seconds) {
           Period period = new Period(1000 * seconds);
           return "PT" + period.getHours() + "H" + period.getMinutes() + "M" + period.getSeconds() + "S";
       }
      

      【讨论】:

      • @jarnbjo 我测试了它,它确实如此。 secondsAsFormattedString(60*60*24*2 + 62) => PT48H1M2S。你的输出是什么?
      • 你说得对,我实际上并没有尝试过。与 Joda API 文档的情况一样,Period 类的文档不一致,并且构造函数 Period(long) 没有填充所述的“标准字段集”,假设使用“标准字段集” “标准周期类型”是 ment,“支持年、月、周、日、小时、分钟、秒和毫秒”。
      【解决方案4】:

      由于 ISO 8601 允许持续时间字符串中的各个字段溢出,您只需在秒数前加上“PT”并附加“S”:

      int secs = 4711;
      String iso8601format = "PT" + secs + "S";
      

      这将输出“PT4711S”,相当于“PT1H18M31S”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-01
        • 2011-03-11
        • 1970-01-01
        • 1970-01-01
        • 2013-05-05
        • 2011-04-22
        相关资源
        最近更新 更多