将 hh:mm:ss 转换为 mmm:ss

Convert hh:mm:ss to mmm:ss

我有一个 Java 函数可以将秒数转换为特定格式 (hh:mm:ss):

public static String formatChronometer(long seconds) {
    return String.format("%02d:%02d:%02d", TimeUnit.SECONDS.toHours(seconds),
            TimeUnit.SECONDS.toMinutes(seconds) % TimeUnit.HOURS.toMinutes(1),
            TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));
}

我的客户想要展示这个没有 "hour" 标签的计时器。示例:

  1. 如果100 hours => 6000:00
  2. 如果0 hours and 50 minutes => 50:00
  3. 如果1 hour and 12 minutes and 30 seconds => 72:30
  4. 如果10 hours and 5 minutes => 600:05
  5. 如果0 hours, 0 minutes and 0 seconds => 00:00

我应该如何改变我的方法?

只需放弃小时位即可。

return String.format("%04d:%02d",
    TimeUnit.SECONDS.toMinutes(seconds),
    TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));

从格式中删除您的hours

public static String formatChronometer(long seconds) {
    return String.format("%02d:%02d",
            TimeUnit.SECONDS.toMinutes(seconds),
            TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));
}

对于灵活的分钟数,您必须使用 %d 而不是 %02d 来指定您想要的数字,您的解决方案应如下所示:

return String.format("%d:%02d",
        TimeUnit.SECONDS.toMinutes(seconds),
        TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1)
);

例子

long[] times = {360000, 3000, 4350, 36300, 0};
for (long time : times) {
    String result = String.format("%d:%02d",
            TimeUnit.SECONDS.toMinutes(time),
            TimeUnit.SECONDS.toSeconds(time) % TimeUnit.MINUTES.toSeconds(1));
    System.out.println(String.format("%d : %s", time, result));
}

输出

360000 : 6000:00
3000   : 50:00
4350   : 72:30
36300  : 605:00
0      : 0:00
public static String formatChronometer(long seconds) {
    Duration dur = Duration.ofSeconds(seconds);
    return String.format("%02d:%02d", dur.toMinutes(), dur.toSecondsPart());
}

当我将 36005 输入此方法时,它返回 600:05

我认为你的计时器秒表示持续时间,时间量。经过的时间或倒计时的值。不是一天中的某个时间(您以 100 小时为例,但一天中的时间永远不会是 100 小时)。在那种情况下,我显然会使用 Duration class 对其进行建模。这是最正确的做法。有些人使用自我记录这个词来描述考虑到这一点而编写的代码。

Duration.toSecondsPart 方法仅在 Java 9 中引入。如果您使用的是 Java 8(或 Java 6 或 7 与 ThreeTen Backport),请获取秒部分减去分钟然后转换为秒:

    long minutes = dur.toMinutes();
    dur = dur.minusMinutes(minutes);
    return String.format("%02d:%02d", minutes, dur.toSeconds());

那么结果是一样的

PS 如果您的秒数改为表示一天中的时间,则正确的自我记录解决方案是使用 LocalTime class:

    LocalTime chrono = LocalTime.ofSecondOfDay(seconds);
    return String.format("%02d:%02d",
            chrono.get(ChronoField.MINUTE_OF_DAY), chrono.getSecond());

这将拒绝大于 86399 的秒值,但有一个例外,因为一天中的时间不能为 24:00 或更大。