使用getTime无法比较两个时间段

时间:2018-03-09 07:35:55

标签: java datetime time

我是Java的新手。我给了3次,在&#34; HH:mm:ss&#34;格式。我应该接受输入(以整数(并且必须在几分钟内))将其添加到第3次。如果时间的总和小于第1次和第2次(第1次<=第2次),则必须打印1.如果仅小于第2次,则应打印2.如果两者都不小,则打印假的。

但是,映射日期的双变量I&m的值正在返回 有时负值(请检查输出)。

有人可以帮我理解为什么吗?感谢。

import java.util.*;
import java.text.*;

public class TimeTrial2 {
    public static void main(String q[]) throws ParseException
    {
    Scanner x=new Scanner(System.in);

    SimpleDateFormat y=new SimpleDateFormat("HH");
    SimpleDateFormat k=new SimpleDateFormat("HH:mm:ss");

    String b=x.nextLine();
    Date c=k.parse(b);//1st Time
    String d=x.nextLine();
    Date e=k.parse(d);//2nd Time
    String f=x.nextLine();
    Date g=k.parse(f);//Time to be added to the input
    int a=x.nextInt();//Input time i
    a=a/60;

    Date z=y.parse(Integer.toString(a));
    double p=(z.getTime()+g.getTime()); 
    double r=c.getTime();
    double s=e.getTime();

    System.out.println(p+"\n"+r+"\n"+s); `//to check the values of p,r and s`
    if(r>=p)
    {
        System.out.println("1");
    }

    else if(s>=p)
    {
        System.out.println("2");
    }

    else
    {
        System.out.println("FALSE!");
    }
}

}

输入

4时30分○○秒

6时00分○○秒

四点00分00秒

60

这是我的输出

-2.16E7

-3600000.0

1800000.0

1

编辑:添加330分钟(格林威治标准时间+5:30)可以解决问题。 但是,我建议使用Ole V.V的答案,因为它更容易。我不知道存在这样的日期类和方法。谢谢大家的帮助。

3 个答案:

答案 0 :(得分:1)

考虑如何将时间添加到日期。我尝试使用以下代码将日期添加到日期并且工作正常。

Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(g);
calendar.add(GregorianCalendar.MINUTE, a);

输入:

g = 5:00:00
a = 40

输出:

Thu Jan 01 05:00:00 IST 1970
Thu Jan 01 05:40:00 IST 1970

答案 1 :(得分:0)

尝试使用Date类的equals() , before() , after()方法。

参考java Api docs

答案 2 :(得分:0)

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Scanner;

public class TimeTrial3 {

    public static void main(String... commandLineArguments) {
        Scanner consoleInput = new Scanner(System.in);
        DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("H:mm:ss");

        String time1String = consoleInput.nextLine();
        LocalTime time1 = LocalTime.parse(time1String, timeFormatter);
        String time2String = consoleInput.nextLine();
        LocalTime time2 = LocalTime.parse(time2String, timeFormatter);
        if (time2.isBefore(time1)) {
            System.err.println("First time must be before or equal to second time, they were"
                    + time1 + " and " + time2);
            System.exit(1);
        }

        String timeToAddString = consoleInput.nextLine();
        LocalTime timetoAdd = LocalTime.parse(timeToAddString, timeFormatter);
        int minutesToAdd = consoleInput.nextInt();
        LocalTime timeToCompare = timetoAdd.plusMinutes(minutesToAdd);
        if (timeToCompare.isBefore(time1))
        {
            System.out.println("1");
        }
        else if (timeToCompare.isBefore(time2))
        {
            System.out.println("2");
        }
        else
        {
            System.out.println("False");
        }
    }

}

您的代码问题

  • Date课程不太适合代表一天中的某个时段。
  • DateSimpleDateFormat类已经过时了,后者尤其出了名的麻烦。我建议你根本不要使用它们。相反,我正在使用并热烈推荐java.time,即现代Java日期和时间API。与它合作是非常好的。
  • 当您可以将库类用于日期和/或时间时,请执行此操作。请勿使用doublelong
  • 一个观察,而不是一个真正的问题:你似乎处于距离UTC(如斯里兰卡或印度)-05:30的时区?例如,你的4:30:00输入在1970年1月1日(纪元日)的时间被解析为偏差-5:50,相当于纪元前1小时,所以它出现为-3600000.0因为-3600秒等于-1小时。只要您的所有时间都处于相同的偏移量,这本身就不是问题。然后你仍然可以使用beforeafter来比较它们,就像哈尔哈·库马尔雷迪在another answer中所说的那样。
  • 当您尝试从两个Date对象添加毫秒时,会出现问题。第三次,4:00:00,在纪元前30分钟解析为1小时,在纪元前4小时30分钟解析60分钟。添加两者时,您希望时间为5:00:00(在您的时区)。相反,你会在纪元前6小时打印,打印为-2.16E7(在我的电脑上,我得到的结果不同,因为我在不同的时区)。
  • 通过将输入的分钟数除以60来获得小时数,您将失去精确度。例如,如果输入是90分钟(一个半小时),则在分割后仅1小时。
  • 如评论中所述,您应该使用解释变量名称。你可能对你选择的名字背后有一个想法,但我没有得到它。

链接

Oracle tutorial: Date Time解释如何使用java.time