сравнение двух времен больше или меньше в java



  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 для всех типов входных данных

728   4  

4 ответов:

Вам нужно использовать Date#before (дата),Date#after (Date) и Date#equals(Date) методы сравнения базовых дат.

Например:

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.

Как говорится в документах:

Значение 0, если дата аргумента равна этой дате; значение меньше чем 0, если эта дата находится перед Аргумент даты; и значение больше чем 0, если эта дата находится после аргумента Date.

В вашем случае вы получаете -1, потому что

  1. new SimpleDateFormat("HHH:mm:ss"); это неправильно. Должно быть новое SimpleDateFormat("HH:mm:ss");

  2. int compare= sqlTime3.compareTo(Sqldob1); в этом sqlTime3 есть только время. Дата-это дата эпохи, поскольку вы об этом не упомянули, и, следовательно, она всегда будет перед new Date(), которая является сегодня.

Ваше решение: - (надеюсь, что это касается вашего задача)

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");
}

Вам нужно разобрать дату и вызвать методы, такие как 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 ");
}

Если оба date и date1 равны, вы можете использовать метод equals,

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

compareTo() метод всегда возвращает ноль для равных и ненулевые для неравных дат.

Современная версия:

    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
Дело в том, что со старыми и теперь уже давно устаревшими классами Date и Time легко не получить все правильно. С современными классами, которые я использую здесь, гораздо прощеполучить их правильно.

Вы используете типы java.sql, потому что вам действительно нужно получить дату и время из базы данных и/или сохранить их в одну? Это было то, для чего они были предназначены, вы не должны действительно использовали их для других целей. Я использую" был "и" были " намеренно, потому что они вам больше не нужны для этой цели. С новым драйвером JDBC вы можете получить LocalDateTime из базы данных и сохранить его обратно, или в зависимости от типа данных столбца получить Instant и преобразовать его в LocalDateTime:

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

PS пункт 2. в ответе Содурахула дается реальное и правильное объяснение того, что пошло не так в вашей программе: хотя Time предназначалось только для времени суток, ваш Sqldob1 заканчивается вплоть до сегодняшней даты и sqlTime3 даты эпохи (1 января 1970 года), поэтому первые всегда будут после вторых по их методу before.

Comments

    Ничего не найдено.