用java计算时差

用java计算时差,java,Java,我想用java计算时差。我仅在1小时内成功计算。当我输入1小时以上的时间时,计算是错误的 String start= "12:00:00"; String end= "12:50:00"; SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss"); Date date1 = format.parse(start); Date date2 = format.parse(end); long diff

我想用java计算时差。我仅在1小时内成功计算。当我输入1小时以上的时间时,计算是错误的

String start= "12:00:00";
    String end= "12:50:00";
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
    Date date1 = format.parse(start);
    Date date2 = format.parse(end);
    long difference = date2.getTime() - date1.getTime();
    System.out.println(difference/1000);

    double time = difference/1000;

    double tot = time/60;

    JOptionPane.showMessageDialog(this, tot);
从上述代码中成功显示50分钟的结果

我修改了相同的代码,代码如下所示:

String start = "12:00:00";
    String end = "01:50:00";
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
    Date date1 = format.parse(start);
    Date date2 = format.parse(end);
    long difference = date2.getTime() - date1.getTime();
    System.out.println(difference/1000);

    double time = difference/1000;

    double tot = time/60;

    JOptionPane.showMessageDialog(this, tot);
这里显示结果

-610.0我不知道为什么我需要显示1.50的输出

字母|日期或时间成分
一天中的小时数(0-23)。
上午/下午小时(1-12)

因此,在您的例子中,有代表24小时时间格式的
“HH:mm:ss”
。 从00:00开始到23:59

因此,对于上述模式,您可以将其更改为如下所示:

String start = "12:00:00";
String end = "13:50:00";
或者,您可以按如下方式更改您的模式:

SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
String start = "12:00:00";
String end = "01:50:00";

请参见结果:

,因为您在AM | PM表单中输入了时间,但您的代码应该使用24小时时间格式。 把时间从

String end = "01:50:00";

它将像一个符咒一样工作:)
(或者您可以将代码更改为使用AM-PM时间模型,但这将更加困难。

实际上,我将使用新的OffsetTime类来解决此问题

下面是一些示例代码:

public static  void distance(String strTime1, String strTime2) {
    OffsetTime time1 = OffsetTime.parse(strTime1);
    OffsetTime time2 = OffsetTime.parse(strTime2);

    int time1Seconds = time1.get(ChronoField.MINUTE_OF_DAY);
    int time2Seconds = time2.get(ChronoField.MINUTE_OF_DAY);

    System.out.println("Time 1 in seconds: " + time1Seconds);
    System.out.println("Time 1 in seconds: " + time2Seconds);
    System.out.println("Distance: " + Math.abs(time1Seconds - time2Seconds));
}
您要做的是将一个字符串simliar解析到您的字符串中。不同的是,我建议您始终添加时区信息。因为它在您的情况下可能不太重要,所以我只添加+00:00

请不要使用Mathematic.abs()。只要您对两次之间的距离感兴趣,而不是对距离的方向感兴趣,您就可以使用它来去除正负前缀,并使用绝对值

这样,您就可以通过解析这个字符串来创建OffsetTime。然后您就可以读取一天中的分钟数

请尝试以下方法:

public static void main(String[] args) {
    distance("10:00:00+00:00", "12:00:00+00:00");
    distance("12:30:00+00:00", "12:31:00+00:00");
    distance("12:31:00+00:00", "12:30:00+00:00");
}
结果将是:

Time 1 in seconds: 600
Time 1 in seconds: 720
Distance: 120
Time 1 in seconds: 750
Time 1 in seconds: 751
Distance: 1
Time 1 in seconds: 751
Time 1 in seconds: 750
Distance: 1
你提到你需要分钟的分数,比如1.5。分数总是很复杂而且不精确。这就是为什么人们发明了BigDecimal。但是,在你的情况下,BigDecimal没有帮助。我建议你使用更小的单位,比如秒

只需将代码更改为:

    int time1Seconds = time1.get(ChronoField.SECOND_OF_DAY);
    int time2Seconds = time2.get(ChronoField.SECOND_OF_DAY);
以下是一些Javadocs:

以及新课程的教程(JDK8):

是的,凌晨两点前10点是中午之前-你在想什么?这是对24小时和12小时格式的要求吗?还是你想坚持12小时格式?你是否计划使用ad AM/PM标识符?是的,皮罗说恢复监控你的时间是24小时。1:50是12小时之前,所以它应该是负值并获得cu纠正answer@Javafiversry答案未完全发布。已更新
    int time1Seconds = time1.get(ChronoField.SECOND_OF_DAY);
    int time2Seconds = time2.get(ChronoField.SECOND_OF_DAY);