2011-12-28 3 views
2

Я пытаюсь сравнить две даты с текущей датой. Кажется, что это не сработает, когда я пытаюсь узнать, совпадает ли дата с текущей датой. Вот что я в моем коде:Сравнение дат в Java

//BeginDate is set earlier 

Date myDate= new SimpleDateFormat("dd/MM/yyyy").parse(BeginDate); 
Date now = new Date(); 

    System.out.println("Now : " + now); 
    System.out.println("myDate : " + myDate); 
    System.out.println("equals : " + myDate.equals(now)); 
    System.out.println(myDate.compareTo(now)); 

И я получаю это в консоли:

Now : Thu Dec 29 00:28:45 CET 2011 
myDate : Thu Dec 29 00:00:00 CET 2011 
equals : false 
-1 

Первое сравнение должно вернуть истинное и второй «0» правильно? Или я чего-то не хватает?

+0

Как устанавливается 'beginDate'? –

+0

1) Откуда начинается «начало»? 2) Первый «equals» вернет false, потому что даты не совпадают. Вы также должны 'SimpleDateFormat'' date'. – ProfessionalAmateur

+0

Каков результат BeginDate, который вы задали раньше? – Aram

ответ

1

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

Или, если вы предпочитаете, вы можете преобразовать даты в строки и выполнить сравнение:

String beginDate = "28/12/2011"; 
    Calendar now = Calendar.getInstance(); 
    DateFormat df = new SimpleDateFormat("dd/MM/yyyy"); 
    String nowStr = df.format(new Date()); 
    System.out.println("equals : " + beginDate.equals(nowStr)); 
+0

Я использовал ваш код, чтобы получить «String» и поставить «новый SimpleDateFormat (« dd/MM/yyyy »). Parse (nowStr)', поэтому я может сравниться с другими моими датами, потому что они установлены одинаково (с помощью juste dd/mm/yyy). Благодаря ! – ShiniFox

+0

Если вы хотите, чтобы «compareTo» дал правильные ответы, вам нужно будет использовать формат, который определяет год сначала, затем месяц, затем дату. –

5

Сравнение дат с помощью либо equals(), либо compareTo() сравнивает время (часы, минуты, секунды, миллис), а также даты. Ваш тест не срабатывает, потому что myDate сегодня полночь, тогда как now немного позже этого.

+0

Хорошо, полезно знать ^^ Любые предложения о том, как сравнивать только даты (дни)? – ShiniFox

+0

Я не знаю о «хорошем» способе этого. Обычно я делаю объект Calendar из каждой даты, которую я хочу сравнить, а затем устанавливаю часы, минуты, секунды и миллисекунды в ноль в каждом календаре, а затем сравниваю календари. Посмотрите на Javadoc for Calendar и отправьте сообщение, если вы не можете понять это. Если кто-нибудь знает более простой способ сделать это, я бы хотел это услышать. –

+0

@ShiniFox, Joda time - это календарная библиотека для Java, которая упрощает эти вещи. Он имеет ['LocalDate'] (http://joda-time.sourceforge.net/api-release/org/joda/time/LocalDate.html), который является всего лишь днем ​​и отделен от' DateTime'. –

0

Вы указываете миллисекунды при создании дат? Если да, то нет. Поэтому, создавая даты раньше, укажите только день, час и т. Д., А не секунды/миллисекунды.

И, измените SimpleDateFormat соответственно. Это должно «работать».

0

Дата объект в Java нет ничего, но число, которое представляет миллисекунды с 1 января 1970 года, 00: 00:00 GMT. У него нет атрибутов, называемых день, дата, месяц, год и т. Д. Это потому, что дата, месяц, год варьируются в зависимости от типа календаря и часового пояса. Эти атрибуты относятся к экземпляру Calendar.

Итак, если у вас есть 2 Число: объекты и вы хотите сравнить день, месяц и год, то вы должны создать соответствующие календар экземпляра и сравнить их по отдельности.

// Parse begin date 
DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy"); 
Date beginDate = dateFormat.parse(beginDateAsString); 
// Create calendar instances 
Calendar beginDateCalendar = Calendar.getInstance(); 
beginDateCalendar.setTime(beginDate); 
Calendar todayCalendar = Calendar.getInstance(); 
// Check Equals 
boolean dayEquals = todayCalendar.get(Calendar.DAY_OF_MONTH) == beginDateCalendar 
     .get(Calendar.DAY_OF_MONTH); 
boolean monthEquals = todayCalendar.get(Calendar.MONTH) == beginDateCalendar 
     .get(Calendar.MONTH); 
boolean yearEquals = todayCalendar.get(Calendar.YEAR) == beginDateCalendar 
     .get(Calendar.YEAR); 
// Print Equals 
System.out.println(dayEquals && monthEquals && yearEquals); 

Вышеуказанный код является громоздким для текущей проблемы, но объясняет, как должны выполняться операции даты в JAVA.

Если вы просто хотите решить равно проблему вы упомянули, то следующий код будет достаточно:

String todayAsString = (new SimpleDateFormat("dd/MM/yyyy")).format(new Date()); 
System.out.println(beginDateAsString.equals(todayAsString)); 
0

Если вы только собираетесь иметь дело с датами между годами 1900 и 2100, есть простой расчет, который даст вам количество дней, прошедших с 1900 года:

public static int daysSince1900(Date date) { 
    Calendar c = new GregorianCalendar(); 
    c.setTime(date); 

    int year = c.get(Calendar.YEAR) - 1900; 
    int month = c.get(Calendar.MONTH) + 1; 
    int days = c.get(Calendar.DAY_OF_MONTH); 

    if (month < 3) { 
     month += 12; 
     year--; 
    } 
    int yearDays = (int) (year * 365.25); 
    int monthDays = (int) ((month + 1) * 30.61); 

    return (yearDays + monthDays + days - 63); 
} 

Таким образом, дата (только) сравнение может быть достигнуто путем проверки, если количество дней, прошедших с 1900 по 2 даты равны.

ПРИМЕЧАНИЕ. Вышеуказанный метод должен содержать код, чтобы проверить, находятся ли даты вне допустимого диапазона (1/1/1900 - 31/12/2099) и выбрасывают исключение IllegalArgumentException.

И не спрашивайте меня, откуда пришли эти расчеты, потому что мы использовали его с начала 90-х годов.