1

为什么下面 Java 代码的输出是 04:18:23 而不是 03:18:23?

public static void main(String[] args) {
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    try {
        Date start = sdf.parse("00:44:16");
        Date end = sdf.parse("04:02:39");
        long duration = end.getTime() - start.getTime();
        Calendar cal = Calendar.getInstance();
        cal.setTimeInMillis(duration);
        System.out.println(sdf.format(cal.getTime()));
    } catch (ParseException e) {
        e.printStackTrace();
    }
}
4

3 回答 3

10

因为这不是你获得持续时间的方式。将您的代码更改为:

package com.sandbox;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Sandbox {

    public static void main(String[] args) {
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
        try {
            Date start = sdf.parse("00:44:16");
            Date end = sdf.parse("04:02:39");
            long duration = end.getTime() - start.getTime();
            Calendar cal = Calendar.getInstance();
            cal.setTimeInMillis(duration);
            System.out.println(new SimpleDateFormat("yyyy MM dd HH:mm:ss").format(cal.getTime()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

你会看到它打印出来1969 12 31 19:18:23。那是一个日期而不是一个持续时间。由于您在打印答案时跳过了日期组件,因此看起来像是在打印持续时间,但实际上并非如此。

坦率地说,我不知道如何在 java 中做到这一点。我只是使用 JodaTime 库。有一个名为Duration的类使这变得容易。这是一个 SO 问题,展示了如何使用它以任何您想要的方式打印出结果:java 中的“漂亮打印”持续时间

于 2013-06-05T20:05:17.747 回答
3

或者,如果您不想使用 JodaTime,从持续时间(以毫秒为单位)计算小时、分钟和秒非常简单:

public static void main(String[] args) throws ParseException {
  SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
  Date start = sdf.parse("00:44:16");
  Date end = sdf.parse("04:02:39");
  long durationMs = end.getTime() - start.getTime();

  final int oneHourMs = 3600000;
  final int oneMinuteMs = 60000;
  final int oneSecondMs = 1000;

  long hours = durationMs / oneHourMs;
  long minutes = (durationMs % oneHourMs) / oneMinuteMs;
  long seconds = (durationMs % oneMinuteMs) / oneSecondMs;

  System.out.format("%02d:%02d:%02d", hours, minutes, seconds); 
  // outputs: 03:18:23
}
于 2013-06-05T20:30:06.123 回答
0

问题:

  • 您正在将时间值塞入日期时间对象中。
  • 您正在使用臭名昭著的麻烦的旧日期时间类,现在是遗留的,被 java.time 类所取代。

该类LocalTime表示没有日期和时区的时间值。

LocalTime start = LocalTime.parse( "00:44:16" ); 
LocalTime stop = LocalTime.parse( "04:02:39" );

表示未附加到时间线的Duration时间跨度。

Duration duration = Duration.between ( start , stop );
于 2016-11-13T17:15:52.370 回答