【问题标题】:How to compute duration between 2 timestamp variables?如何计算 2 个时间戳变量之间的持续时间?
【发布时间】:2021-04-13 07:51:37
【问题描述】:

我想计算 2 个时间戳变量之间的持续时间并以 HH:MM:SS 格式输出

val start_time = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now)
val sourceFormat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
val start_time_dt = sourceFormat.parse(start_time)
val end_time = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now)
val end_time_dt = sourceFormat.parse(end_time)

我正在尝试这样做:

Duration.between(end_time_dt, start_time_dt)

但我收到以下错误:

found   : java.util.Date
required: java.time.temporal.Temporal

【问题讨论】:

标签: scala java-time


【解决方案1】:

您将旧的java.util.Date 与新的java.time.LocalDateTime 混合在一起。

import java.time.{LocalDateTime, Duration}

val start = LocalDateTime.now()
val end   = LocalDateTime.now()
val dur   = Duration.between(start, end)

dur.getNano()     //res0: Int = 390318000
dur.getSeconds()  //res1: Long = 0
dur.isZero()      //res2: Boolean = false

您还应该注意,在往返于日期和时间的特定文本表示时,您只需要 Formatter。由于您发布的代码示例既不读取日期时间String,也不打印日期时间String,因此我没有在此处包含任何格式。

【讨论】:

    【解决方案2】:

    Next 应该适合你 - 底线:如果你正在使用 java.time 包,请不要使用它之外的任何东西,例如 java.util.Date

    import java.time._
    import java.time.format._
    
    val sourceFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
    
    val start_time = sourceFormat.format(LocalDateTime.now)
    val start_time_dt = LocalDateTime.parse(start_time, sourceFormat)
    
    val end_time = sourceFormat.format(LocalDateTime.now)
    val end_time_dt = LocalDateTime.parse(end_time, sourceFormat)
    
    Duration.between(end_time_dt, start_time_dt)
    

    产生结果:PT0S: java.time.Duration

    斯卡斯蒂:https://scastie.scala-lang.org/o4itYdPrRdCNE5bosJEOfw

    【讨论】:

      【解决方案3】:

      方法Duration.between() 不接受时间戳作为参数。您需要做的就是:

      Duration.between(end_time_dt.toInstant(), start_time_dt.toInstant());
      

      【讨论】:

        【解决方案4】:

        java.time.Instant

        LocalDateTime 类未定义时间点,因此为它们使用的类是错误的。使用它有时会给你错误的持续时间。一个好用的类是Instant

            Instant start = Instant.now();
            TimeUnit.SECONDS.sleep(10);
            Instant end = Instant.now();
            Duration elapsedTime = Duration.between(start, end);
            
            System.out.println(elapsedTime);
            System.out.format("%02d:%02d:%02d%n", elapsedTime.toHours(),
                    elapsedTime.toMinutesPart(), elapsedTime.toSecondsPart());
        

        示例输出:

        PT10.002595S
        00:00:10
        

        我正在使用的DurationtoXxxPart 方法是在Java 9 中引入的。

        【讨论】:

        • 感谢我使用的是 Java 8...我使用了这个 val dur = "%02d:%02d:%02d".format(duration.toHours(), duration.toMinutes(), duration.getSeconds()) 但时间到了 00:28:1713 会以这种格式 (1713) 出现吗?
        • 有一些选择,@justanothertekguy。例如参见my answer here 的后半部分或How to format a duration in java? (e.g format H:MM:SS) 下的答案。
        【解决方案5】:

        基于 Ivan Kurchenko 的 cmets 和 jwh 下面是我汇总的内容!不确定是否有其他更好的方法来获取 HH:MM:SS 格式的持续时间

        import java.time._
        import java.time.format._
        
        val sourceFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")
        
        val start_time = sourceFormat.format(LocalDateTime.now)
        val start_time_dt = LocalDateTime.parse(start_time, sourceFormat)
        Thread.sleep(10000)
        val end_time = sourceFormat.format(LocalDateTime.now)
        val end_time_dt = LocalDateTime.parse(end_time, sourceFormat)
        val duration = Duration.between(start_time_dt, end_time_dt)
        val seconds = duration.getSeconds()
        val time_sec = seconds % 60
        val time_min = (seconds/60) % 60
        val time_hour = (seconds/60)/ 60
        
        val dur = f"$time_hour%02d:$time_min%02d:$time_sec%02d"
        

        【讨论】:

        • 为什么要格式化并解析回来?这是多余的,最好跳过。如果在 Java 9 及更高版本上使用,Duration 还可以直接为您提供小时、分钟和秒:使用 toHours()toMinutesPart()toSecondsPar()
        猜你喜欢
        • 2015-03-30
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多