【问题标题】:Issue Converting seconds to HH:MM:SS java问题将秒转换为 HH:MM:SS java
【发布时间】:2017-09-08 09:26:35
【问题描述】:

我有一个长变量,它表示应用程序的停机时间(以秒为单位)。我想将停机时间显示为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,我们会得到正确的答案。

Duration d = Duration.ofSeconds(downTime);
PT12M35S

但是格式不是我想要的。

【问题讨论】:

  • 看看这里如何格式化持续时间:stackoverflow.com/questions/266825/….
  • 如果您使用 UTC,您当前的代码将可以工作,您的本地时区必须比 UTC 早一小时。
  • 另外,如果您可以访问 Duration 类,这意味着您正在使用 Java 8。所以不要再使用旧的 Date 类了。使用 java.time 包中的类。
  • 只是说,但如果你使用java.time.Duration,至少使用完整的java.time包,而不是java.util.Date
  • @procrastinator 问题根本不要求当前时间。问题是关于在一段时间内破解一天中的时间格式。此外,避免遗留类。使用现代 java.time 类要容易得多。 LocalTime.MIN.plusSeconds( 755L ).toString()

标签: java date datetime time long-integer


【解决方案1】:

LocalTime.MIN

LocalTime.MIN.plusSeconds( 755L ) 

或者,

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

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

默认情况下,LocalTime::toString 方法在为零时忽略尾随单元。要强制所有三个部分(小时、分钟、秒),请使用 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 类中默认使用标准格式来解析/生成字符串。

PT12M35S

或者生成一个字符串,用散文拼写出时间量。

【讨论】:

  • 我同意这个 hack 可能会造成混淆。 Duration 存在(并且由 OP 知道)来表示持续时间......使用它作为解决方案。
【解决方案2】:

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

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);

【讨论】:

    【解决方案3】:

    你快到了

    java.time.DurationISO-8601 standards 为模型,并作为JSR-310 implementation 的一部分与Java-8 一起引入。 Java-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。

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

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

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

    查看The Difference between Since and For – English grammar

    【讨论】:

      猜你喜欢
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-30
      • 2021-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多