1

我有一个 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));
}

我的客户想展示这个没有“小时”标签的计时器。例子:

  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

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

4

4 回答 4

3

只是放弃时间。

return String.format("%04d:%02d",
    TimeUnit.SECONDS.toMinutes(seconds),
    TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));
于 2018-01-19T18:17:28.660 回答
3

对于灵活的分钟数,您必须使用它%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
于 2018-01-19T18:36:40.400 回答
2
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该类对其进行建模。这是最正确的做法。有些人使用自我记录这个词来描述考虑到这种考虑而编写的代码。

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

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

然后结果是一样的。

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

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

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

于 2018-01-19T21:05:19.520 回答
0

hours从格式中删除您的

public static String formatChronometer(long seconds) {
    return String.format("%02d:%02d",
            TimeUnit.SECONDS.toMinutes(seconds),
            TimeUnit.SECONDS.toSeconds(seconds) % TimeUnit.MINUTES.toSeconds(1));
}
于 2018-01-19T18:34:56.363 回答