Должен ли я использовать Calendar.compareTo() для сравнения дат? - программирование
Подтвердить что ты не робот

Должен ли я использовать Calendar.compareTo() для сравнения дат?

Это допустимый способ сравнения дат:

Calendar someCalendar1 = Calendar.getInstance(); // current date/time
someCalendar1.add(Calendar.DATE, -14);

Calendar someCalendar2 = Calendar.getInstance();
someCalendar2.setTime(someDate); // someDate is in the format of MM/dd/yyyy

if(someCalendar2.compareTo(someCalendar1) < 0){
   ...Code...               
}

... или есть лучший подход?

4b9b3361

Ответ 1

Date реализует сопоставимые значения, поэтому нет причин для его включения в календарь:

Calendar someCalendar1 = Calendar.getInstance(); // current date/time
someCalendar1.add(Calendar.DATE, -14);

if (someDate.compareTo(someCalendar1.getTime()) < 0) {
   ...Code...                           
}

Дата также имеет удобный after() и before(), которые упрощают чтение приведенного выше сравнения:

if (someDate.before(someCalendar1.getTime())) {
   ...Code...                           
}

Наконец, если вы имеете дело с датой/временем много, подумайте об использовании Joda Time вместо встроенных классов Java. Это намного более удобно и функционально:

DateTime dt = new DateTime().minusWeeks(2);
if (new DateTime(someDate).isBefore(dt)) {
   ...Code...                           
}

Ответ 2

Это правда, но вы немного смущены о someDate - Calendar.setTime принимает java.util.Date, который является всего лишь оберткой вокруг long, указывающей число миллисекунд с полуночи 1 января 1970 года, UTC. Это не "в формате MM/dd/yyy" - это строковое представление, а не java.util.Date. Если это произойдет, чтобы напечатать что-то в формате MM/dd/yyyy, это то, что делает Date.toString для вас - это не неотъемлемо часть формата.

В стороне, я лично рекомендую вам полностью избегать java.util.Date и java.util.Calendar и вместо этого использовать Joda Time. Это гораздо лучший API.

Ответ 4

В качестве одного из примеров того, почему Джода лучше, выберите "Летнее время".

Если вы измеряете "один день" как 1000 * 60 * 60 * 24 миллисекунды, библиотека Date - и библиотека календаря - оба забывают, что там один день в году с 25 часами, а другой с 23. You будут иногда зачеркнуть расчеты даты, если вы будете полагаться исключительно на классы Java, встроенные в J2SE API.

Joda, по всей вероятности, станет заменой для GregorianCalendar, Calendar и Date в будущей версии Java.

Ответ 5

Все в порядке. Также вы можете использовать before() и after():

package demo.so;

import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;

public class Tester {

    public static void main(String[] args) throws Exception {

    Calendar someCalendar1 = Calendar.getInstance(); // current date/time
    someCalendar1.add(Calendar.DATE, -11);

    DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
    Date someDate =   df.parse("10/08/2009");

    Calendar someCalendar2 = Calendar.getInstance();
    someCalendar2.setTime(someDate);

    String cal1 = df.format(someCalendar1.getTime());
    String cal2 = df.format(someCalendar2.getTime());

    if (someCalendar1.equals(someCalendar2))
        System.out.println( cal1 + " is the same as " + cal2);
    if (someCalendar1.after(someCalendar2))
        System.out.println(cal1 + " is after " + cal2);
    if (someCalendar1.before(someCalendar2))
        System.out.println(cal1 + " is before " + cal2);

    }

}

Но вы не должны использовать Date, устарел и источник проблем с обработкой дат. Создайте собственную оболочку для GregorianCalendar или используйте какую-нибудь хорошую библиотеку, например Joda.