计算两小时之间的时差格式hh:mm:ss java

时间:2018-06-08 08:39:39

标签: java date datetime

我想计算两个小时之间的差异。时间格式必须是hh:mm:ss!我实现了这段代码:

public static String timeDifference(long timeDifference1) {

    long timeDifference = timeDifference1 / 1000;
    int h = (int) (timeDifference / (3600));
    int m = (int) ((timeDifference - (h * 3600)) / 60);
    int s = (int) (timeDifference - (h * 3600) - m * 60);

    return String.format("%02d:%02d:%02d", h, m, s);
}

public static void main(String[] args) throws ParseException {
    Scanner sc = new Scanner(System.in);
    while (sc.hasNext()) {
        String timeStart = sc.next();
        String timeStop = sc.next();
        char lol[]=timeStop.toCharArray();
        if(lol[0]=='0' && lol[1]=='0'){
            lol[0]='2';
            lol[1]='4';
        }
        String tetx=String.valueOf(lol);
        timeStop=tetx;

        char kk[]=timeStart.toCharArray();
        if(kk[0]=='0' && kk[1]=='0'){
            kk[0]='2';
            kk[1]='4';
        }
        String hhh=String.valueOf(kk);
        timeStart=hhh;

        SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");

        Date d1 = null;
        Date d2 = null;

        d1 = format.parse(timeStart);
        d2 = format.parse(timeStop);

        long diff;

        if (d1.getTime() > d2.getTime()) {
            diff = (int) (d1.getTime() - d2.getTime());

        } else
            diff = (int) (d2.getTime() - d1.getTime());

        System.out.println(timeDifference(diff));

    }
}

输入必须是:

10:03:43 15:00:58

13:00:00 14:00:00

00:00:00 12:05:00

12:05:00 00:00:00

输出:

04:57:15

01:00:00

12:05:00

11:55:00 

但是我得到了

04:57:15

01:00:00

00:05:00

00:05:00 

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

不要重新发明轮子。您可以使用java.time包完成所有这些操作。

一旦我们要求第二个00:00:00值代表明天,逻辑就变得不那么优雅了。我们需要使用LocalDateTime并可能添加一天:

private static String getDifference(final String first, final String second)
{
    final LocalTime firstTime = LocalTime.parse(first, DateTimeFormatter.ISO_LOCAL_TIME);
    final LocalTime secondTime = LocalTime.parse(second, DateTimeFormatter.ISO_LOCAL_TIME);

    final LocalDateTime firstDateTime = LocalDateTime.of(LocalDate.now(), firstTime);
    final LocalDateTime secondDateTime = LocalDateTime.of(
        LocalDate.now().plusDays(second.equals("00:00:00") ? 1 : 0),
        secondTime
    );

    final Duration diff = Duration.between(firstDateTime, secondDateTime).abs();

    return String.format(
        "%02d:%02d:%02d",
        diff.toDaysPart() < 1 ? diff.toHoursPart() : 24,
        diff.toMinutesPart(),
        diff.toSecondsPart()
    );
}

这样打电话:

System.out.println(getDifference("12:05:00", "00:00:00"));

示例输出:

  

11时55分00秒

请注意,JDK 9中添加了toMinutesPart及其兄弟方法。逻辑在JDK 8中非常相似,但更详细。

答案 1 :(得分:1)

The answer by Michael很好(+1)。请允许我补充说,您不需要提及任何格式化程序(虽然我也看到了明确格式化的优势)并且您不需要发明一个人为的,可能不正确的日期来处理24:00问题

        LocalTime start = LocalTime.parse(timeStart);
        LocalTime stop = LocalTime.parse(timeStop);
        if (stop.isAfter(start)) { // the normal situation
            System.out.println(formatDuration(Duration.between(start, stop)));
        } else if (stop.equals(LocalTime.MIDNIGHT)) {
            System.out.println(
                    formatDuration(Duration.between(start, stop).plusDays(1)));
        } else {
            System.out.println("End time " + timeStop + " was before start time " + timeStart);
        }

我假设时间是在同一天,除了00:00:00的结束时间意味着当天结束时的午夜(有时候我称之为24.00)。如果您需要计算,比如从一天的13:00到13:00到第二天的24小时,只需删除第二个if条件和最后一个else块。

提供示例输入会显示您要求的输出:

04:57:15
01:00:00
12:05:00
11:55:00

正如迈克尔所提到的,{9}中引入了toMinutesParttoSecondsPart方法。有关如何格式化早期Java版本中的持续时间,请参阅my answer here

您的代码出了什么问题?

要正确解析24小时制(12:05:00,13:00,6:00:00,15:00:58)的时间,您需要使用大写HH小时天。小写hh表示AM或PM从01到12(含)。如果未指定AM或PM,则默认使用AM。所以10:03:43按照你的预期进行解析。有趣的是15:00:58虽然没有15:00:58 AM,但是太平了。 SimpleDateFormat只是推断。自上午12:05:00起12:05:00出现问题,意味着00:05:00。在我的电脑上我得到了23:55:00(不是00:05:00,正如你所说的那样)。这是因为您首先将开始时间更改为24:00:00,然后计算从00:05:00到24:00:00(即23:55:00)的时间。由于您知道哪个时间是开始时间,哪个是结束时间,因此您可能不应该在它们看起来顺序错误的情况下交换它们。在你的最后一个例子中我也得到了23:55:00。发生的情况是相同的,除了时间没有交换,因为00:05:00已经在24:00:00之前。

答案 2 :(得分:0)

请在SimpleDateFormat中将hh更改为HH。这将为您提供24小时格式的结果。 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");

答案 3 :(得分:0)

您可以添加日期来修复它:

np.random.seed(100)
df = pd.DataFrame(np.random.randint(10, size=(3,3)), columns=list('ABC'))
print (df)
   A  B  C
0  8  8  3
1  7  7  0
2  4  2  5

a =  np.where(df == 8)
print (a)
(array([0, 0], dtype=int64), array([0, 1], dtype=int64))

b = list(zip(df.index[a[0]], df.columns[a[1]]))
print (b)
[(0, 'A'), (0, 'B')]

输出将是:

  

12:05:00

     

11时55分00秒