问题将秒数转换为 HH:MM:SS java

Issue Converting seconds to HH:MM:SS java

我有一个 long 变量,它表示应用程序的停机时间(以秒为单位)。我想将停机时间显示为 HH:mm:ss

Long downTime = 755; 
Date newD = new Date(downTime * 1000);

将 long 变量传递给 Date 时,我将其相乘 1000 以获得毫秒值。 newD 变量的计算结果为 Thu Jan 01 01:12:35 GMT 1970

newD的值是关闭1小时,755秒是=00:12:35

据我了解,秒 * 1000 = 毫秒将得出正确答案。作为 I seen here

如果我使用持续时间,我们会得到正确的答案。

Duration d = Duration.ofSeconds(downTime);
PT12M35S

但是格式不是我想要的。

LocalTime.MIN

LocalTime.MIN.plusSeconds( 755L ) 

或者,

LocalTime.MIN.plus( 
    Duration.ofSeconds( 755L ) 
)

警告: 这是一个 hack,我不推荐它。将时间跨度表示为一天中的时间是模棱两可且令人困惑的。

默认情况下,LocalTime::toString method omits the trailing units if zero. To force all three parts (hours, minutes, seconds), use a DateTimeFormatter

DateTimeFormatter f = DateTimeFormatter.ofPattern( "HH:mm:ss" ) ;
String output = lt.format( f ) ;

看到这个code run live at IdeOne.com

00:12:35

ISO 8601

我建议,如果可能的话,对您的用户进行标准 ISO 8601 格式的培训。这种格式实用、清晰、明确。默认情况下,java.time 类 中 parsing/generating 字符串使用标准格式。

PT12M35S

或者生成一个字符串,以散文形式拼出时间量。

检查你是否可以使用这个:

long millis = 755000;
String hms = String.format("%02d:%02d:%02d", 
    TimeUnit.MILLISECONDS.toHours(millis),
    TimeUnit.MILLISECONDS.toMinutes(millis) % TimeUnit.HOURS.toMinutes(1),
    TimeUnit.MILLISECONDS.toSeconds(millis) % TimeUnit.MINUTES.toSeconds(1));
System.out.println(hms);

你快到了

java.time.Duration is modelled on ISO-8601 standards and was introduced with Java-8 as part of JSR-310 implementationJava-9 引入了一些更方便的方法。

如果您浏览过上述链接,您可能已经注意到 PT12M35S 指定了 12 分 35 秒的持续时间。由于您已经获得了 Duration 对象,因此您可以从该对象中获取天、小时、分钟、秒,从而根据您的要求创建一个格式化的字符串。

演示:

import java.time.Duration;

public class Main {
    public static void main(String[] args) {
        Long downTime = 755L;
        Duration duration = Duration.ofSeconds(downTime);// PT12M35S

        // Default format
        System.out.println(duration);

        // Custom format
        // ####################################Java-8####################################
        String formattedElapsedTime = String.format("%02d:%02d:%02d", duration.toHours() % 24,
                duration.toMinutes() % 60, duration.toSeconds() % 60);
        System.out.println(formattedElapsedTime);
        // ##############################################################################

        // ####################################Java-9####################################
        formattedElapsedTime = String.format("%02d:%02d:%02d", duration.toHoursPart(), duration.toMinutesPart(),
                duration.toSecondsPart());
        System.out.println(formattedElapsedTime);
        // ##############################################################################
    }
}

输出:

PT12M35S
00:12:35
00:12:35

Trail: Date Time.

了解现代日期时间 API
  • 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它向后移植了大部分 java.time Java 6 和 7 的功能。
  • 如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaring and

持续时间和日期是不同的概念

您的要求是计算持续时间而不是日期时间。 SimpleDateFormatjava.time.format.DateTimeFormatter(现代日期时间 API 的一部分)应该用于表示 date/time/date-time 即表示时间点而不是 period/duration 的时间。记住这一点的经验法则是:

  1. 使用 SimpleDateFormatjava.time.format.DateTimeFormatter 表示您在英语语法时态中使用 since 表示的内容。
  2. 使用 Period and Duration 表示您在英语语法时态中用 for 表示的内容。

勾选The Difference between Since and For – English grammar