在java中比较两次或多或少

时间:2013-09-27 08:21:26

标签: java datetime

  Date date1= new java.util.Date();
                  java.sql.Date Sqldob = new java.sql.Date(date1.getTime());
                  System.out.println("date" +Sqldob);

                  Time Sqldob1 = new Time(date1.getTime());
                  System.out.println("User Time: " +Sqldob1);
                  String yourTime="09:30:00"; 

                  SimpleDateFormat ra = new SimpleDateFormat("HH:mm:ss");
                  Date yourDate = ra.parse(yourTime);
                  Time sqlTime3 = new Time(yourDate.getTime());
                  System.out.println("your time"+sqlTime3);

                  if(Sqldob1.before(sqlTime3)){
                     Sqldob1 = sqlTime3; 
                     System.out.println("inside loop");
                  }

在上面的代码中,我将两个时间变量进行比较以获得相等性,但它为所有类型的输入提供了相同的值-1

4 个答案:

答案 0 :(得分:10)

您需要使用Date#before(Date)Date#after(Date)Date#equals(Date)方法进行基本日期比较。

<强> E.g:

Date d1 = new Date();
Date d2 = new Date();

if(d1.after(d2)){
    // Do something
}

if(d1.before(d2)){
    // Do something
}

if(d1.equals(d2)){
    // Do something
}

您也可以使用Date#compareTo(Date)方法,但是,您需要相应地解释compareTo方法的输出。

正如文档所说:

  

如果参数Date等于此Date,则值为0;价值减去   如果此Date在Date参数之前,则为0;并且值更大   如果此Date在Date参数之后,则为0。

在您的情况下,您将获得-1,因为

  1. new SimpleDateFormat("HHH:mm:ss");错了。应该是新的SimpleDateFormat("HH:mm:ss");

  2. int compare= sqlTime3.compareTo(Sqldob1);这个sqlTime3只有时间。日期是您没有提及的日期,因此,它始终位于new Date()之前,今天

  3. 您的解决方案: - (希望这能解决您的问题)

    java.util.Date date1= new java.util.Date();
    
    Time Sqldob1 = new Time(date1.getTime());
    System.out.println("User Time: " +Sqldob1);
    
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 19); // Your hour
    cal.set(Calendar.MINUTE, 30); // Your Mintue
    cal.set(Calendar.SECOND, 00); // Your second
    
    Time sqlTime3 = new Time(cal.getTime().getTime());
    System.out.println("your time: "+sqlTime3);
    
    if(Sqldob1.before(sqlTime3)){
       Sqldob1 = sqlTime3; 
       System.out.println("inside loop");
    }
    

答案 1 :(得分:3)

您需要解析日期并像这样调用before()after()equals()等方法,

if(date.before(date1)){
    System.out.println(" date is before date1 ");
}
if(date.after(date1)){
    System.out.println(" date is after date1 ");
}

如果datedate1都相同,则可以使用equals方法,

if(date.equals(date1)){
    System.out.println(" date and date1 are equal");
}

答案 2 :(得分:0)

对于不等的日期,

compareTo()方法总是返回0表示相等和非零。

答案 3 :(得分:0)

现代版:

    LocalDateTime dateTime1 = LocalDateTime.now(ZoneId.systemDefault());
    LocalDate dob = dateTime1.toLocalDate();
    System.out.println("date " + dob);

    LocalTime dob1 = dateTime1.toLocalTime();
    System.out.println("User Time: " + dob1);

    String yourTime = "09:30:00"; 
    LocalTime time3 = LocalTime.parse(yourTime);
    System.out.println("your time " + time3);

    if (dob1.isBefore(time3)) {
        dob1 = time3;
        System.out.println("inside if statement");
    }

今天早上运行此代码时,它打印出来了:

date 2017-07-07
User Time: 05:32:01.881
your time 09:30
inside if statement

重点是:对于旧的和现在已久的过时类DateTime,很容易 来使事情正确。使用我在这里使用的现代课程,正确地

它们会更容易。

您使用java.sql类型是因为您确实需要从数据库获取日期和时间和/或将它们存储到一个数据库中吗?这就是这些,你不应该将它们用于其他目的。我故意使用“was”和“are”,因为你不再需要它们用于此目的。使用新的JDBC驱动程序,您可以从数据库中获取LocalDateTime并将其存储回来,或者根据您的列数据类型获取Instant并将其转换为LocalDateTime

    LocalDateTime dateTime2 = instantFromDb.atZone(ZoneId.systemDefault())
            .toLocalDateTime();

PS项目2. SoduRahul’s answer中提供了对您的计划中出现问题的真实和正确的解释:虽然Time仅用于时间,但Sqldob1结束持有今天的日期和sqlTime3时代的日期(1970年1月1日),所以前者总是按照before方法在后者之后。