【问题标题】:Converting 2 strings with milliseconds into date and calculating time difference java将2个毫秒的字符串转换为日期并计算时间差java
【发布时间】:2020-09-01 15:34:33
【问题描述】:

我有 2 个包含分钟、秒和毫秒的字符串

String startTime = "02:58.917"
String finishTime = "04:03.332"

我需要计算时差。据我了解(但我不确定),最简单的方法是将它们转换为 Date 类型,但我不知道如何正确地做到这一点,尤其是毫秒。 附言如果有人知道我如何在不转换为日期的情况下计算时差,它也适合。 请帮忙!

UPD:我需要得到相同格式的结果,比如“01:04:415”

【问题讨论】:

  • 这可能会有所帮助:stackoverflow.com/questions/6403851/…
  • 这能回答你的问题吗? Java string to date conversion
  • @AliAhmad,它很有用,但我需要得到相同格式的结果,比如“01:04:415”,我还是不明白该怎么做
  • 您的字符串是否代表时间点,即大约一小时后的 3 分钟和 4 分钟,还是代表您需要减去的时间量(例如持续时间)?这两种情况的正确方法是不同的。
  • 在这种情况下,我认为 Arvind Kumar Avinash 和 akuzminykh 的答案是正确的。将单圈的持续时间与时间点采用相同的格式是不是有点令人困惑?

标签: java date type-conversion milliseconds datetime-conversion


【解决方案1】:

您可以通过计算开始时间和结束时间之间的差异来获得java.time.Duration对象。然后,您可以从Duration 对象中获取分钟部分、秒部分和毫秒部分,以获得所需的输出。

import java.text.ParseException;
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;

public class Main {
    public static void main(String[] args) throws ParseException {
        String startTime = "02:58.917";
        String finishTime = "04:03.332";
        // Create a format by defaulting the hour to any value e.g. 0
        DateTimeFormatter format = new DateTimeFormatterBuilder().append(DateTimeFormatter.ofPattern("mm:ss.SSS"))
                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0).toFormatter();
        LocalTime firstTime = LocalTime.parse(startTime, format);
        LocalTime secondTime = LocalTime.parse(finishTime, format);
        Duration diff = Duration.between(firstTime, secondTime);
        String msms = String.format("%02d:%02d:%03d", diff.toMinutesPart(), diff.toSecondsPart(), diff.toMillisPart());
        System.out.println("The difference is " + msms);
    }
}

输出:

The difference is 01:04:415

【讨论】:

    【解决方案2】:

    这是一个如何使用java.time 的示例:

    // create dtf for pattern where mm is minutes, ss is seconds, SSS is millis
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("mm:ss.SSS");
    
    // we need to add a default value for hour so the parsing with LocalTime works
    formatter = new DateTimeFormatterBuilder()
            .append(formatter)
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 1)
            .toFormatter();
    
    // parse the values
    LocalTime t1 = LocalTime.parse("02:58.917", formatter);
    LocalTime t2 = LocalTime.parse("04:03.332", formatter);
    
    // get the millis between t1 and t2
    System.out.println(t1.until(t2, ChronoUnit.MILLIS));
    
    // another way
    System.out.println(ChronoUnit.MILLIS.between(t1, t2));
    
    // you can get the result in the same format by adding the difference
    // to a new LocalTime with all set to zero and using the formatter
    LocalTime delta = LocalTime.of(1, 0, 0, 0)
            .plus(t1.until(t2, ChronoUnit.MILLIS), ChronoUnit.MILLIS);
    System.out.println(delta.format(formatter));
    

    【讨论】:

    • 但是如果我需要得到相同格式的结果,我能做什么,比如“01:04:415”?
    • @Ilya 您可以通过创建一个新的LocalTime 并将其全部设置为零并添加以毫秒为单位的差异来做到这一点。然后使用格式化程序为您提供所需的String。查看编辑并随时接受答案。
    • 大部分答案都很好。在前两个之间的持续时间内再使用一个LocalTime 是不正确的。在 Arvind Kumar Avinash 的回答中使用 Duration。它也更简单。
    • @OleV.V.感谢您的考虑。我会保持原样,因为它是另一种选择。这不是错误的,结果是一样的。 Duration 可能看起来更方便一些。
    • 我可以再问一个问题吗?我想知道它是如何工作的,并尝试了这个代码 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss.SSS"); LocalTime t1 = LocalTime.parse("01:02:58.917", formatter);但它失败了。你能说出什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 2017-10-11
    • 2012-09-12
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多