2010-08-30 18 views
5

Sto acquisendo alcuni dati da un database con un valore di data memorizzato e sto consentendo all'utente di selezionare intervalli di date per i quali vorrebbero visualizzare i dati. Tutto il mio codice per ottenere questi intervalli di date funziona tranne il metodo per ottenere l'intervallo di date che copre tutto il tempo, che sarebbe un valore iniziale dei dati Java più precoci possibile, fino al valore finale della data massima possibile.Java: Intervallo di date minime e massime

c'è qualcosa di sbagliato con il mio codice, perché non riesco a vedere un problema:

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

Cosa restituisce il metodo? –

risposta

4

Perché rendere la vita così complicata? Se non si dispone di una data di inizio, non eseguire una query per una data di inizio. Se non si dispone di una data di fine, non eseguire una query per una data di fine. E se non ne hai nessuno, non interrogare per nessuna data.

+0

Haha sì, è quello che ho finito per fare. Questo era un caso speciale, e poiché ogni altro caso aveva un inizio/fine ho usato solo un metodo. Finito per scrivere un metodo per coprire questo caso e ha scritto una query che non ha controllato la data. Detto questo, mi infastidisce non sapere e mi piacerebbe davvero sapere perché questo non funzionava. –

0

Quel codice funziona, forse non ti aspetti i valori restituiti?

Inizio: sab 1 gennaio 00:00:00 PST 1 fine: Mer 17 Apr 21:34:08 PST 292.269.054

(Sarebbe più facile per aiutare se hai incluso l'analisi dello stack)

17

Perché non utilizzare

  1. new Date (Long.MIN_VALUE) (nell'anno 292.269.055 aC)
  2. new Date (Long.MAX_VALUE) (nell'anno 292.278.994 dC)?

Dal froginvasion sfidato la risposta, ho pensato di doppio controllo

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)); 

mi ha dato

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 

penso che sia giusto. Presumo che l'AD/BC siano stati soppressi. Il suggerimento di utilizzare la nuova data (0) come minimo è chiaramente errato perché la nuova data (-giorno) è chiaramente più piccola.

+0

Soluzione semplice ed elegante! – nobre

+0

D'accordo !, ottimo per usare i valori statici per questo! +1 – will824

+1

'new Date (Long.MIN_VALUE)' non funzionerà, testarlo.In realtà non fa qualcosa che ti aspetteresti. Se vuoi usarlo, usa 'new Date (0)' che è il 1 ° gennaio 1970. – froginvasion

0

Ho il sospetto che possa ottenere un overflow impostando l'anno e quindi impostando i valori massimi per tutti gli altri campi separatamente. Ciò renderebbe il tuo tempo di fine da qualche parte intorno all'orario di inizio e farà sì che tutti i record vengano respinti. Potresti provare a stampare i tempi del calendario per vedere cosa sta succedendo.

Come fa notare il seanizzatore, lo stai rendendo davvero più complicato di quanto dovrebbe essere - il modo corretto per gestire questo è di lasciare la clausola della data non completamente nella query. Questo può essere difficile a volte perché l'istruzione sql non viene generata dinamicamente. Ma notare che anche se non è possibile modificare il codice SQL in fase di esecuzione, la condizione (in Oracle)

start_date >= nvl(?, start_date) 

sarà sempre soddisfatta se il valore fornito è nullo e data_iniziale è popolato.

Problemi correlati