【问题标题】:How do I convert seconds into accumulated hhh:mm:ss?如何将秒数转换为累积的 hhh:mm:ss?
【发布时间】:2015-07-14 15:52:18
【问题描述】:

我想将经过的累积秒数转换为小时:分钟:秒。例如

93599 秒到:

25:59:59

我该怎么做? (注意:24h 不应该换成 0h)

【问题讨论】:

  • 想想除法和余数运算符。 (或使用java.time 或 Joda Time...)
  • @JohnyText Stack Overflow 充满了类似的问题。是什么促使您发布问题并在发布问题后 2 分钟内自行回答?
  • 因为我找不到关于累积时间的好答案,所以写了一个解决方案并编造了一个问题,以便其他人(和我)可以从累积时间格式化程序中受益。 :-)
  • 但我也想知道是否有人有一个超级解决方案,不涉及减法和模数和废话......
  • 所以积累时间,明白了。

标签: java time seconds elapsedtime


【解决方案1】:

模数运算符% 在这里很有用。这样的东西会很好用

public static void convertTime(int seconds) {
    int secs = seconds % 60;
    int mins = (seconds / 60) % 60;
    int hours = (seconds / 60) / 60;
    System.out.printf("%d:%d:%d", hours, mins, secs);
}

【讨论】:

  • 这里的数字运算更好。我会把它放在我的格式中。
【解决方案2】:

Java 8 提供了java.time.Duration 类来表达时间量。您可以使用Duration#ofSeconds(long) 从几秒钟内构建一个实例。

Duration ellapsed = Duration.ofSeconds(93599);

但是,默认的toString 格式看起来像

PT25H59M59S

这不是你想要的。您可以自己计算(使用各种toMinutestoHours 等)将其转换为您想要的格式。举个例子here

【讨论】:

    【解决方案3】:

    小时 = 93599 / 3600。使用整数算术强制截断。

    然后从 93599 中减去 hours * 3600。称之为 foo。或计算 93599 % 3600。

    分钟 = foo / 60。使用整数算术。

    从 foo 中减去分钟 * 60。打电话给那个酒吧。或者计算 foo % 60。

    bar 是剩余的秒数。

    【讨论】:

      【解决方案4】:

      复制并使用这个类:

      public class AccumulatedTimeFormat extends Format {
      
      @Override
      public StringBuffer format(Object obj, StringBuffer toAppendTo, FieldPosition pos) {
          Long totalSeconds;
      
          if(obj instanceof Byte) {
              totalSeconds=((Byte)obj).longValue();
          } else if(obj instanceof Short) {
              totalSeconds=((Short)obj).longValue();
          } else if(obj instanceof Integer) {
              totalSeconds=((Integer)obj).longValue();
          } else if(obj instanceof Long) {
              totalSeconds=((Long)obj);
          } else {
              throw new IllegalArgumentException("Cannot format given Object as an accumulated-time String!");
          }
      
          long ss = Math.abs(totalSeconds) % 60;
          long mm = (Math.abs(totalSeconds) / 60) % 60;
          long h = (Math.abs(totalSeconds) / 60) / 60;
      
          if(totalSeconds<0) {
              toAppendTo.append('-');
          }
          toAppendTo.append(String.format("%d:%02d:%02d", h, mm, ss));
      
          return toAppendTo;
      }
      
      @Override
      public Object parseObject(String source, ParsePosition pos) {
          //TODO Implement if needed!
          return null;
      }
      

      }

      像这样:

      System.out.println((new AccumulatedTimeFormat()).format(93599));
      

      哪些打印:

      25:59:59
      

      【讨论】:

      • 好吧,这看起来有点矫枉过正,首先......而且没有解释(重要的三行被埋在中间),这对未来的访问者没有太大帮助。
      • 我不同意 - 你简单地复制类并执行 (new AccumulatedTimeFormat()).format(93599);
      • 这并不意味着它不是矫枉过正......(事实上它只支持Format部分意味着它不是确实是一个很好的解决方案...如果您只需要格式化部分,并且只需要 intlong (很可能),那么您可以在大约 5 行内完成。)
      • int h=(int)(Math.abs(totalSeconds)/3600); 对于totalSeconds 的某些值可能会溢出。此外,double 可能不会转换为 long。我不会更相信这个代码,就像我可以吐一头大象一样。
      • 你可怜的代码库最终继任者会问“为什么,为什么,他们不使用标准库函数?”。
      猜你喜欢
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-19
      相关资源
      最近更新 更多