【问题标题】:Android Java : How to subtract two times?Android Java:如何减去两次?
【发布时间】:2026-01-19 00:50:01
【问题描述】:

我在我的项目中使用了某种秒表,我有

start time ex: 18:40:10 h
stop time  ex: 19:05:15 h

我需要这两个值的结果,例如final time = stop - start

我找到了一些例子,但它们都非常令人困惑。

有什么简单的解决办法吗?

【问题讨论】:

    标签: java android timer subtraction


    【解决方案1】:

    如果您有字符串,则需要使用 java.text.SimpleDateFormat 将它们解析为 java.util.Date。比如:

            java.text.DateFormat df = new java.text.SimpleDateFormat("hh:mm:ss");
            java.util.Date date1 = df.parse("18:40:10");
            java.util.Date date2 = df.parse("19:05:15");
            long diff = date2.getTime() - date1.getTime();
    

    这里的 diff 是 18:40:10 到 19:05:15 之间经过的毫秒数。

    编辑 1:

    在网上找到了一个方法(http://www.javaworld.com/javaworld/jw-03-2001/jw-0330-time.html?page=2):

      int timeInSeconds = diff / 1000;
      int hours, minutes, seconds;
      hours = timeInSeconds / 3600;
      timeInSeconds = timeInSeconds - (hours * 3600);
      minutes = timeInSeconds / 60;
      timeInSeconds = timeInSeconds - (minutes * 60);
      seconds = timeInSeconds;
    

    编辑 2:

    如果你想要它作为一个字符串(这是一种草率的方式,但它有效):

    String diffTime = (hours<10 ? "0" + hours : hours) + ":" + (minutes < 10 ? "0" + minutes : minutes) + ":" + (seconds < 10 ? "0" + seconds : seconds) + " h";
    

    编辑 3:

    如果你想要毫秒,就这样做

    long timeMS = diff % 1000;
    

    然后您可以将其除以 1000 以获得秒的小数部分。

    【讨论】:

    • Aham 我看到了这样的样本,但我再次需要 01:10.34 h 的结果,在这里我得到毫秒的结果,需要更多的数学来获得希望的结果,有没有最简单的解决方案?
    • 如果您的时间只记录小时、分钟和秒,您将如何获得毫秒的结果?
    • quadelirus 非常感谢,我得到了我想要的 :) 我使用: start= System.currentTimeMillis();但我做了一些 DateFormating 只得到几个小时 :) 现在我得到了我需要的东西,再次感谢..
    • 我已经完成了一些字符串格式化,但是当我测试这些行时,它是更好的解决方案:) 再次感谢 quadelirus。
    【解决方案2】:

    假设您使用的是java.util.Date

    long totalTime = endDate.getTime() - startDate.getTime();
    

    结果将以毫秒为单位。

    【讨论】:

    • 谢谢蒂埃里我完成了一项任务:)
    【解决方案3】:

    我正在提供现代答案。

    java.time 和 ThreeTenABP

        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("H:mm:ss 'h'");
    
        String startTimeString = "18:40:10 h";
        String stopTimeString = "19:05:15 h";
    
        LocalTime startTime = LocalTime.parse(startTimeString, timeFormatter);
        LocalTime stopTime = LocalTime.parse(stopTimeString, timeFormatter);
    
        if (stopTime.isBefore(startTime)) {
            System.out.println("Stop time must not be before start time");
        } else {
            Duration difference = Duration.between(startTime, stopTime);
    
            long hours = difference.toHours();
            difference = difference.minusHours(hours);
            long minutes = difference.toMinutes();
            difference = difference.minusMinutes(minutes);
            long seconds = difference.getSeconds();
    
            System.out.format("%d hours %d minutes %d seconds%n", hours, minutes, seconds);
        }
    

    这个例子的输出是:

    0 小时 25 分 5 秒

    其他答案是 2010 年的好答案。今天避免上课 DateFormatSimpleDateFormatDate。 java.time 是现代 Java 日期和时间 API,使用起来更方便。

    但它不需要 API 级别 26 吗?

    不,使用 java.time 在较旧和较新的 Android 设备上运行良好。它只需要至少 Java 6

    • 在 Java 8 及更高版本以及更新的 Android 设备(从 API 级别 26 起)中,现代 API 是内置的。
    • 在非 Android Java 6 和 7 中,获取 ThreeTen Backport,这是现代类的后向端口(对于 JSR 310,ThreeTen;请参阅底部的链接)。
    • 在(较旧的)Android 上使用 ThreeTen Backport 的 Android 版本。它被称为 ThreeTenABP。并确保从 org.threeten.bp 导入日期和时间类以及子包。

    链接

    【讨论】:

      【解决方案4】:

      试试这个答案会对你有很大帮助

      来自here

      在这个答案中,你会发现减法到两次丢弃了日、月和年。

      它为您提供在达到第二个时间值之前您将花费的分钟数。

      【讨论】:

        【解决方案5】:

        今天,使用更新的 Java(不知道在哪个 Android 版本上可以使用):

        Instant before = Instant.now();
        // do stuff
        
        Duration.between(before, Instant.now()).getSeconds()
        

        过去那些笨拙的 java 方式现在已经不复存在了。

        【讨论】: