2010-08-30 2 views
5

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

Есть ли что-то случилось с моим кодом, потому что я не могу видеть проблему:

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; 
    } 
+0

Что возвращает ваш метод? –

ответ

4

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

+0

Ха-ха-да, вот что я в итоге сделал. Это был особый случай, и поскольку у каждого другого случая был какой-то старт/конец, я просто использовал один метод. Закончился написание метода для покрытия этого случая и написал запрос, который не проверял дату. Это говорит, что мне нечего знать, и я бы очень хотел знать, почему это не работает. –

0

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

Начало: сб 1 января 00:00:00 PST 1 Конец: Ср 17 апреля 21:34:08 PST 292269054

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

17

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

  1. новой Дату (Long.MIN_VALUE) (в YEAR 292269055 до н.э.)
  2. новой даты (Long.MAX_VALUE) (в YEAR 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) как минимум явно неверно, потому что новая дата (день) явно меньше.

+0

Простое и элегантное решение! – nobre

+0

Согласен !, очень хорошо использовать Статические значения для этого! +1 – will824

+1

'new Date (Long.MIN_VALUE)' wont work, протестируйте его.На самом деле это не значит, что вы ожидаете. Если вы хотите использовать это, используйте 'new Date (0)', который находится в 1-м января 1970 года. – froginvasion

0

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

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

start_date >= nvl(?, start_date) 

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

Смежные вопросы