Подтвердить что ты не робот

Сравните две даты в Java

Мне нужно сравнить две даты в java. Я использую код следующим образом:

Date questionDate = question.getStartDate();
Date today = new Date();

if(today.equals(questionDate)){
    System.out.println("Both are equals");
}

Это не работает. Содержимое переменных следующее:

  • questionDate содержит 2010-06-30 00:31:40.0
  • today содержит Wed Jun 30 01:41:25 IST 2010

Как я могу это решить?

4b9b3361

Ответ 1

Равенство даты зависит от двух дат, равных миллисекунде. Создание нового объекта Date с помощью new Date() никогда не будет равным дате, созданной в прошлом. API Joda Time упрощают работу с датами; однако, используя только Java SDK:

if (removeTime(questionDate).equals(removeTime(today)) 
  ...

public Date removeTime(Date date) {    
    Calendar cal = Calendar.getInstance();  
    cal.setTime(date);  
    cal.set(Calendar.HOUR_OF_DAY, 0);  
    cal.set(Calendar.MINUTE, 0);  
    cal.set(Calendar.SECOND, 0);  
    cal.set(Calendar.MILLISECOND, 0);  
    return cal.getTime(); 
}

Ответ 2

Я бы использовал JodaTime для этого. Вот пример - скажем, вы хотите найти разницу в днях между двумя датами.

DateTime startDate = new DateTime(some_date); 
DateTime endDate = new DateTime(); //current date
Days diff = Days.daysBetween(startDate, endDate);
System.out.println(diff.getDays());

JodaTime можно загрузить с здесь.

Ответ 3

Мне непонятно, чего вы хотите, но я упомянул, что класс Date также имеет compareTo, который может использоваться для определения одним вызовом, если два объекта Date равны или (если они не равны), что происходит раньше. Это позволяет вам сделать что-то вроде:

switch (today.compareTo(questionDate)) {
    case -1:  System.out.println("today is sooner than questionDate");  break;
    case 0:   System.out.println("today and questionDate are equal");  break;
    case 1:   System.out.println("today is later than questionDate");  break;
    default:  System.out.println("Invalid results from date comparison"); break;
}

Следует отметить, что документы API не гарантируют, что результаты будут равны -1, 0 и 1, поэтому вы можете использовать if-elses, а не коммутатор в любом производственном коде. Кроме того, если вторая дата равна NULL, вы получите исключение NullPointerException, поэтому может быть полезно обернуть ваш код в try-catch.

Ответ 4

Самый простой способ сравнить две даты - преобразовать их в числовое значение (например, временную метку unix).

Вы можете использовать метод Date.getTime(), который возвращает время unix.

Date questionDate = question.getStartDate();
Date today = new Date();
if((today.getTime() == questionDate.getTime())) {
    System.out.println("Both are equals");
}

Ответ 5

используется esy с помощью time.compareTo(currentTime) < 0

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask {
    static Timer singleTask = new Timer();

    @SuppressWarnings("deprecation")
    public static void main(String args[]) {
        // set download schedule time
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 9);
        calendar.set(Calendar.MINUTE, 54);
        calendar.set(Calendar.SECOND, 0);
        Date time = (Date) calendar.getTime();
        // get current time
        Date currentTime = new Date();
        // if current time> time schedule set for next day
        if (time.compareTo(currentTime) < 0) {

            time.setDate(time.getDate() + 1);
        } else {
            // do nothing
        }
        singleTask.schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println("timer task is runing");
            }
        }, time);

    }

}

Ответ 6

java.time

В Java 8 нет необходимости использовать Joda-Time, поскольку он поставляется с похожим новым API в java.time. Используйте класс LocalDate.

LocalDate date = LocalDate.of(2014, 3, 18);
LocalDate today = LocalDate.now();

Boolean isToday = date.isEqual( today );

Вы можете задать промежуток времени между датами с помощью Period class.

Period difference = Period.between(date, today);

LocalDate можно сравнить с помощью equals и compareTo, поскольку он не содержит информации о времени и часовом поясе.

Ответ 7

Следующее вернет true, если две переменные календаря имеют один и тот же день года.

  public boolean isSameDay(Calendar c1, Calendar c2){
    final int DAY=1000*60*60*24;
    return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY));
  } // end isSameDay

Ответ 8

Вот еще один ответ: Вам нужно отформатировать даты буксировки, чтобы они соответствовали одному и тому же, чтобы иметь возможность сравнивать их как строку.

    Date questionDate = question.getStartDate();
    Date today = new Date();

    SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd");

    String questionDateStr = dateFormatter.format(questionDate);
    String todayStr = dateFormatter.format(today);

    if(questionDateStr.equals(todayStr)) {
        System.out.println("Both are equals");
    }

Ответ 9

public static double periodOfTimeInMillis(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime());
}

public static double periodOfTimeInSec(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / 1000;
}

public static double periodOfTimeInMin(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (60 * 1000);
}

public static double periodOfTimeInHours(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (60 * 60 * 1000);
}

public static double periodOfTimeInDays(Date date1, Date date2) {
    return (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000L);
}

Ответ 10

public long compareDates(Date exp, Date today){

        long b = (exp.getTime()-86400000)/86400000;
        long c = (today.getTime()-86400000)/86400000;
        return b-c;
    }

Это работает для GregorianDates. 86400000 - это количество миллисекунд в день, это вернет количество дней между двумя датами.

Ответ 11

Это очень старый пост, хотя я делюсь своей работой. Вот небольшой трюк, чтобы сделать это

DateTime dtStart = new DateTime(Dateforcomparision); 
DateTime dtNow = new DateTime(); //current date

if(dtStart.getMillis() <= dtNow.getMillis())
{
   //to do
}

использовать компаратор согласно вашему требованию

Ответ 12

в моем случае, я просто должен был сделать что-то вроде этого:

date1.toString().equals(date2.toString())

И это сработало!

Ответ 13

Он работает лучше всего.

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();

cal1.setTime(date1);
cal2.setTime(date2);

boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);

Ответ 14

Вот что вы можете сделать для сравнения yyyy-mm-dd:

GregorianCalendar gc= new GregorianCalendar();
gc.setTimeInMillis(System.currentTimeMillis());
gc.roll(GregorianCalendar.DAY_OF_MONTH, true);

Date d1 = new Date();
Date d2 = gc.getTime();

SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd");

if(sf.format(d2).hashCode() < sf.format(d1).hashCode())
{
    System.out.println("date 2 is less than date 1");
}
else
{
    System.out.println("date 2 is equal or greater than date 1");
}