Java: минимальный и максимальный диапазон дат - PullRequest
5 голосов
/ 30 августа 2010

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

Что-то не так с моим кодом, потому что я не вижу проблемы:

public static DateRange getAllTime() {
        /**
         * Get earliest possible
         */
        Calendar c = Calendar.getInstance();
        c.set(
                c.getActualMinimum(Calendar.YEAR), 
                c.getActualMinimum(Calendar.MONTH), 
                c.getActualMinimum(Calendar.DAY_OF_MONTH), 
                c.getActualMinimum(Calendar.HOUR), 
                c.getActualMinimum(Calendar.MINUTE), 
                c.getActualMinimum(Calendar.SECOND)
            );

        c.set(Calendar.MILLISECOND, c.getActualMinimum(Calendar.MILLISECOND));
        Date start = c.getTime();

        /**
         * Get latest possible date
         */
        c.set(
                c.getActualMaximum(Calendar.YEAR), 
                c.getActualMaximum(Calendar.MONTH), 
                c.getActualMaximum(Calendar.DAY_OF_MONTH), 
                c.getActualMaximum(Calendar.HOUR), 
                c.getActualMaximum(Calendar.MINUTE), 
                c.getActualMaximum(Calendar.SECOND)
            );

        c.set(Calendar.MILLISECOND, c.getActualMaximum(Calendar.MILLISECOND));
        Date end = c.getTime();

        DateRange range = new DateRange();
        range.Start = start;
        range.End = end;

        return range;
    }

Ответы [ 4 ]

17 голосов
/ 30 августа 2010

Почему бы не использовать

  1. новая дата (Long.MIN_VALUE) (в ГОД 292269055 до н.э.)
  2. новая дата (Long.MAX_VALUE) (в ГОД 292278994 нашей эры)?

Поскольку froginvasion бросил вызов ответу, я решил проверить еще раз

    long day=1000*60*60*24;
    System.out.println(new Date(Long.MAX_VALUE-day));
    System.out.println(new Date(Long.MAX_VALUE));
    System.out.println(new Date(0));
    System.out.println(new Date(-day));
    System.out.println(new Date(Long.MIN_VALUE));
    System.out.println(new Date(Long.MIN_VALUE+day));

дал мне

Sat Aug 16 07:12:55 GMT 292278994
Sun Aug 17 07:12:55 GMT 292278994
Thu Jan 01 00:00:00 GMT 1970
Wed Dec 31 00:00:00 GMT 1969
Sun Dec 02 16:47:04 GMT 292269055
Mon Dec 03 16:47:04 GMT 292269055

Я думаю, что это правильно. Я предполагаю, что AD / BC просто подавляется. Предложение использовать новую дату (0) как минимум явно неверно, поскольку новая дата (-день) явно меньше.

4 голосов
/ 30 августа 2010

Зачем делать жизнь такой сложной? Если у вас нет даты начала, не запрашивайте дату начала. Если у вас нет даты окончания, не запрашивайте дату окончания. И если у вас нет ни того, ни другого вообще, не запрашивайте даты.

0 голосов
/ 30 августа 2010

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

Как указывает seanizer, вы действительно делаете это более сложным, чем должно быть - правильный способ справиться с этим - полностью исключить предложение date из запроса. Иногда это может быть сложно, потому что оператор sql не генерируется динамически. Но учтите, что даже если вы не можете изменить sql во время выполнения, условие (в Oracle)

start_date >= nvl(?, start_date)

всегда будет выполнено, если предоставленное значение равно нулю, а начальная дата заполнена.

0 голосов
/ 30 августа 2010

Этот код мне подходит, может быть, вы не ожидаете возвращаемых значений?

Начало: сб 01 января 00:00:00 PST 1 Окончание: ср 17 апр 21:34:08 PST 292269054

(было бы легче помочь, если бы вы включили трассировку стека)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...