Сравните две даты на Java - PullRequest
25 голосов
/ 30 июня 2010

Мне нужно сравнить две даты в 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

Как можнорешить это?

Ответы [ 14 ]

42 голосов
/ 30 июня 2010

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

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(); 
}
13 голосов
/ 30 июня 2010

Я бы использовал 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 можно загрузить с здесь .

10 голосов
/ 30 июня 2010

Мне непонятно, что вы хотите, но я упомяну, что класс 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а не переключатель в любом производственном коде.Кроме того, если вторая дата равна нулю, вы получите исключение NullPointerException, поэтому может оказаться полезным обернуть ваш код в try-catch.

5 голосов
/ 13 декабря 2012

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

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

Date questionDate = question.getStartDate();
Date today = new Date();
if((today.getTime() == questionDate.getTime())) {
    System.out.println("Both are equals");
}
3 голосов
/ 18 сентября 2016

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 класса.

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

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


О Java.time

Фреймворк java.time встроен в Java 8 и более поздние версии.Эти классы вытесняют проблемные старые устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , а позже
    • Встроенный-в.
    • Часть стандартного Java API с встроенной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и Java SE 7
    • Большая часть функций java.time перенесена на Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии реализации пакета Android для классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Бэкпорт (упоминается выше).См. Как использовать ThreeTenABP… .

ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

3 голосов
/ 15 февраля 2013

если используется 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);

    }

}
1 голос
/ 10 января 2011

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

  public boolean isSameDay(Calendar c1, Calendar c2){
    final int DAY=1000*60*60*24;
    return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY));
  } // end isSameDay
0 голосов
/ 19 апреля 2017

Лучше всего работает ....

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);
0 голосов
/ 05 июля 2015

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

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

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

0 голосов
/ 14 апреля 2015

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

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

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

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

...