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

Я имею философскую школу, которая говорит что настолько же долго как бизнес-логика:

  • жизни в одна место
  • , где это правильно документируется
  • , надлежащий доступ обеспечивается через сервисы, которые могут быть слабо связаны
  • через опубликованный абстрактный интерфейс

, я не забочусь, живет ли логика в хранимой процедуре, на среднем уровне J2EE, на экспертной системе клипов, или везде, где. Неважно, где Вы храните нашу бизнес-логику, "закон сохранения страдания" собирается гарантировать, что кто-то скажет, что это было неверное представление потому что компонент/репозиторий X потребностей, которые будут выгружены для технологии/метода Y.

16
задан Shog9 1 October 2009 в 18:36
поделиться

5 ответов

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

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

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

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

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

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

DateTime dt = new DateTime().minusWeeks(2);
if (new DateTime(someDate).isBefore(dt)) {
   ...Code...                           
}
20
ответ дан 30 November 2019 в 17:27
поделиться

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

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

Календарь полностью и используйте вместо него Joda Time . Это намного лучший API.

Календарь полностью и используйте вместо него Joda Time . Это намного лучший API.

7
ответ дан 30 November 2019 в 17:27
поделиться
2
ответ дан 30 November 2019 в 17:27
поделиться

В качестве одного из примеров того, почему Joda лучше, возьмем летнее время.

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

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

2
ответ дан 30 November 2019 в 17:27
поделиться

Все в порядке . Также вы можете использовать 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.

0
ответ дан 30 November 2019 в 17:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: